是否可以在自定义ADT排序链接列表中使用2种数据类型?

如何解决是否可以在自定义ADT排序链接列表中使用2种数据类型?

我正在尝试使用排序链表为游戏排行榜。我能够通过将点按降序排序来实现,这意味着高点到低点。此外,我还需要将玩家姓名和分数放在一起。问题来了。我实现的sll(排序链接列表)是一个Integer数据类型,在对数字进行排序时,它与Integer数据类型完美配合。

SortedListInterface<Integer> Player = new leaderboardSortedLinkedList<Integer>();

但是当我尝试放置使用String的播放器名称时,将无法执行此操作,因为点数据类型将需要跟随播放器名称的数据类型。 下面是驱动程序类的代码

public class testleaderboard {

   
    public static void main(String[] args) {
        SortedListInterface<Integer> Player = new leaderboardSortedLinkedList<Integer>();
        
            Player.add(1000000);
            Player.add(500000);
            Player.add(250000);
            Player.add(125000);
            Player.add(64000);
            Player.add(32000);
            Player.add(16000);
            Player.add(8000);
            Player.add(4000);
            Player.add(2000);
            Player.add(1000);
            Player.add(500);
            Player.add(300);
            Player.add(200);
            Player.add(100);
        
        
        System.out.printf("=================================\n" 
                         + "          leaderboard\n"
                         +"=================================\n");
        
        for(int i=0; i< Player.size();i++){
            
            System.out.printf("%3d. %s\n",(i+1),Player.get(i+1));
        }
        
    }
    
}

这是实体类

public class Player {
    private String name;
    private int prize;

    public Player(String name,int prize) {
        this.name = name;
        this.prize = prize;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrize() {
        return prize;
    }

    public void setPrize(int prize) {
        this.prize = prize;
    }

    @Override
    public String toString() {
        return "Player{" + "name=" + name + ",prize=" + prize + '}';
    }
}

这是自定义的排行列表

public class leaderboardSortedLinkedList<T extends Comparable<T>> implements SortedListInterface<T> {

    private Node firstNode;
    private int length;

    public leaderboardSortedLinkedList() {
        firstNode = null;
        length = 0;
    }

    public boolean add(T newEntry) {
        Node newNode = new Node(newEntry);

        Node nodeBefore = null; 
        Node currentNode = firstNode;   
        while (currentNode != null && newEntry.compareto(currentNode.data) < 0) {
            nodeBefore = currentNode;
            currentNode = currentNode.next;
        }

        if (isEmpty() || (nodeBefore == null)) { // CASE 1: add at beginning
            newNode.next = firstNode;
            firstNode = newNode;
        } else {    // CASE 2: add in the middle or at the end,i.e. after nodeBefore
            newNode.next = currentNode;
            nodeBefore.next = newNode;
        }
        length++;
        return true;
    }

    public boolean contains(T anEntry) {
        boolean found = false;
        Node tempNode = firstNode;
        int pos = 1;

        while (!found && (tempNode != null)) {
            if (anEntry.compareto(tempNode.data) <= 0) {
                found = true;
            } else {
                tempNode = tempNode.next;
                pos++;
            }
        }
        if (tempNode != null && tempNode.data.equals(anEntry)) {
            return true;
        } else {
            return false;
        }
    }

    public int size(){
         int count = 0;    
        //Node current will point to head    
        Node current = firstNode;    
            
        while(current != null) {    
            //Increment the count by 1 for each node    
            count++;    
            current = current.next;    
        }    
        return count;   
    }
    
     public T get(int position){
        T result = null;

    if ((position >= 1) && (position <= length)) {
      Node currentNode = firstNode;
      for (int i = 0; i < position - 1; ++i) {
        currentNode = currentNode.next;     // advance currentNode to next node
      }
      result = currentNode.data;    // currentNode is pointing to the node at givenPosition
    }

    return result;
    }
    
    
    public final void clear() {
        firstNode = null;
        length = 0;
    }

    public int getLength() {
        return length;
    }

    public boolean isEmpty() {
        return (length == 0);
    }

    
    public String toString() {
        String outputStr = "";
        Node currentNode = firstNode;
        while (currentNode != null) {
            outputStr += currentNode.data + "\n";;
            currentNode = currentNode.next;
        }
        return outputStr;
    }

    private class Node {

        private T data;
        private Node next;

        private Node(T data) {
            this.data = data;
            next = null;
        }

        private Node(T data,Node next) {
            this.data = data;
            this.next = next;
        }
    }
}

结果在这里

=================================
          leaderboard
=================================
  1. 1000000
  2. 500000
  3. 250000
  4. 125000
  5. 64000
  6. 32000
  7. 16000
  8. 8000
  9. 4000
 10. 2000
 11. 1000
 12. 500
 13. 300
 14. 200
 15. 100

这是我对带有字符串数据类型的点的测试,因为我无法想到一种在我的自定义ADT中同时使用玩家名称和点与2种不同数据类型的方法

public class testleaderboard {

   
    public static void main(String[] args) {
        SortedListInterface<String> Player = new leaderboardSortedLinkedList<String>()
      
            Player.add("1000000");
            Player.add("500000");
            Player.add("250000");
            Player.add("125000");
            Player.add("64000");
            Player.add("32000");
            Player.add("16000");
            Player.add("8000");
            Player.add("4000");
            Player.add("2000");
            Player.add("1000");
            Player.add("500");
            Player.add("300");
            Player.add("200");
            Player.add("100");
            

    System.out.println(Player);
    }

这是它比较字符串的第一个字母的结果。

8000
64000
500000
500
4000
32000
300
250000
2000
200
16000
125000
1000000
1000
100

无论如何,是否可以在一个ADT中同时使用String和Integer,因为如果我不能这样做,我将无法对要点进行排序。我很抱歉这个长问题。我对数据结构和算法非常陌生,因此我确实需要一些帮助。非常感谢。

解决方法

要将点和名称保持在一起,您需要按原样将Player对象添加到列表中,而不仅仅是它们的点或名称:

SortedListInterface<Player> players = new LeaderboardSortedLinkedList<>();

players.add(new Player("Alpha",1000000));
players.add(new Player("Beta",500000));
players.add(new Player("Gamma",250000));

要使此方法起作用,您将需要能够按其点号比较Player对象。为此,您可以实现Comparable接口并添加一个compareTo方法。

您还将想要添加一个toString()方法,以便您可以打印Player对象。

public class Player implements Comparable<Player> {
    private String name;
    private int prize;

    @Override
    public int compareTo(Player other) {
        return Integer.compare(this.prize,other.prize);
    }

    @Override
    public String toString() {
        return String.format("name='%s' prize=%d",name,prize);
    }
}
,

感谢您帮助我成功获得了想要的输出。但这是一个小问题

=================================
           Leaderboard
=================================
  1. name='Alpha' prize=1000000
  2. name='Beta' prize=500000
  3. name='Gamma' prize=250000
BUILD SUCCESSFUL (total time: 1 second)

它以这种方式打印输出[name =“ Alpha”]。我不确定是什么问题,但我想这是我的System.out.print代码。

System.out.printf("%3d. %s\n",(i+1),players.get(i+1));

这是我的.get()函数。

  public T get(int position){
        T result = null;

    if ((position >= 1) && (position <= length)) {
      Node currentNode = firstNode;
      for (int i = 0; i < position - 1; ++i) {
        currentNode = currentNode.next;     // advance currentNode to next node
      }
      result = currentNode.data;    // currentNode is pointing to the node at givenPosition
    }

    return result;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?