Метод вставки связанного списка

1

В процессе написания класса, который демонстрирует связанный список, и я не получаю результаты, которые мне нужны. Я написал класс, который содержит внутренний класс узла, а также метод вставки, который добавляет имя и оценку в список, ограничивает список до десяти, удаляя человека с самым низким счетом. Я также создал тестовую графическую программу. При запуске и вводе команды insert в списке отображается имя моего класса (GamerList), а затем "@" и числа, а не имя желания и оценка. Я подозреваю, что моя проблема была где-то в моем методе вставки. Любая обратная связь будет высоко оценена.

Класс связанного списка

    class GameList
   {
  //node class

  private class Node
  {
    String name;
    int score;
    Node next;

    //Node constructor
    Node(String namVal, int scrVal, Node n)
    {
      name = namVal;
      score = scrVal;
      next = n;
    }

    //Constructor
    Node(String namVal, int scrVal)
    {
      this(namVal, scrVal, null);
    }
  }

  private Node first; //head
  private Node last;  //last element in list

  //Constructor

  public GameList()
  {
    first = null;
    last = null;
  }

  //isEmpty method: checks if param first is empty
  public boolean isEmpty()
  {
    return first == null;
  }

  public int size()
  {
    int count = 0;
    Node p = first;

    while(p != null)
    {
      count++;
      p = p.next;
    }
    return count;
  }

 //Override toString
public String toString()
{
  StringBuilder strBuilder = new StringBuilder();

  // Use p to walk down the linked list
  Node p = first;
  while (p != null)
  {
     strBuilder.append(p.name); 
     p = p.next;
  }      
  return strBuilder.toString(); 
}



  public void insert(String name, int score)
  {
    Node node = new Node(name, score);
    final int MAX_LIST_LEN = 10;

    if(isEmpty())
    {
      first = node;
      first.next = last;
    }

    else if(first.score <= node.score)
    {
      node.next = first;
      first = node;
    }

    else
    {
      Node frontNode = first;
      while(frontNode.score > node.score && frontNode.next != null) 
      {
                frontNode = frontNode.next;
      }
      node.next = frontNode.next;
      frontNode.next = node;
    }

    if(size() > MAX_LIST_LEN)
    {
      Node player = first;
      for(int i = 0; i < 9; i++)
      {
        player = player.next;
      }
      player.next = null;
    }
  }
}

Программа испытаний

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

/**
   This class is used to demonstrate
   the operations in the GameList class.
*/

public class GameListGui extends JFrame
{    
    private  GameList topGamers;
    private JTextArea  listView;
    private JTextField cmdTextField;

    public GameListGui()
    {
       topGamers = new GameList(); 
       listView = new JTextArea();
       cmdTextField = new JTextField();

       // Create a panel and label for result field
       JPanel resultPanel = new JPanel(new GridLayout(1,2));
       resultPanel.add(new JLabel("Command Result"));
       add(resultPanel, BorderLayout.NORTH);

       // Put the textArea in the center of the frame
       add(listView);
       listView.setEditable(false);
       listView.setBackground(Color.WHITE);

       // Create a panel and label for the command text field
       JPanel cmdPanel = new JPanel(new GridLayout(1,2));
       cmdPanel.add(new JLabel("Command:"));
       cmdPanel.add(cmdTextField);
       add(cmdPanel, BorderLayout.SOUTH);  
       cmdTextField.addActionListener(new CmdTextListener());

       // Set up the frame
       setTitle("Linked List Demo");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       pack();
       setVisible(true);       
    }

        private class CmdTextListener
            implements ActionListener
    {            
        public void actionPerformed(ActionEvent evt)
        {
            String cmdText = cmdTextField.getText();
            Scanner sc = new Scanner(cmdText);
            String cmd = sc.next();
            if (cmd.equals("insert")){ 
                if (sc.hasNextInt())
                {
                    // add index element
                    int score = sc.nextInt();
                    String name = sc.next();
                    topGamers.insert(name, score);                
                }
                listView.setText(topGamers.toString());
                pack();
                return;
            }
        }
        }
            public static void main(String [ ] args)
    {
        new GameListGui();
    }    
}
Теги:
list

2 ответа

3
Лучший ответ

Я полагал, что у вас был такой звонок:

topGamers.toString()

toString, если не переопределено, выведет тип объекта и хэш-код. Оба из них совершенно бесполезны для тех из нас, которые не относятся к типу объекта и хеш-коду как к печатаемому представлению.

То, что вы хотите сделать, это реализовать вменяемое String представление вашей GameList вместо этого.

@Override
public String toString() {
    // code
}

Ну... там небольшое предостережение - GameList содержит только Node s, поэтому вам нужно также извлекать информацию из каждого узла. Это означает, что для Node вы также переопределяете toString().

Я оставляю эту часть как упражнение для читателя (траление списка), но вам было бы полезно собрать информацию каждого узла в StringBuilder, а затем вернуть значение toString().

  • 0
    Проголосовал, как вы вошли в гораздо более подробно
  • 0
    Вау, вы оба очень хорошо осведомлены и вдохновляете тех из нас, кто только начинает заниматься этим! Утром я приступлю к работе над чтением на уроке StringBuilder, так как мой профессор еще не осветил эту тему.
Показать ещё 1 комментарий
2

Нет, проблема (в этом конкретном случае я не проверял, действительно ли ваш список делает то, что он должен) заключается в том, что вы не определили метод toString для вашего класса связанных списков, поэтому он использует значение по умолчанию для toString определенной в object, который печатает имя класса и расположение памяти.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню