如何解决是否可以在自定义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 举报,一经查实,本站将立刻删除。