英文:
Is it possible to use 2 Data Type in an Custom ADT(Sorted Linked List)?
问题
我试图通过使用排序链表(Sorted Linked List)来实现一个游戏的排行榜。我已经成功地按照分数降序排列,这意味着分数从高到低排序。此外,我还需要将玩家姓名与分数一起放入排行榜中。问题出在这里。我实现的排序链表(SLL)是整数数据类型,它在整数数据类型上运行得很好,因为它可以对数字进行排序。
```java
SortedListInterface<Integer> Player = new LeaderboardSortedLinkedList<Integer>();
但是,当我尝试放入玩家姓名(使用字符串)时,由于分数数据类型需要与玩家姓名的数据类型一致,所以无法实现。以下是驱动类的代码:
public class testLeaderboard {
public static void main(String[] args) {
SortedListInterface<Integer> Player = new LeaderboardSortedLinkedList<Integer>();
Player.add(1000000);
Player.add(500000);
// 其他分数的添加...
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;
}
// 各种 getter 和 setter...
@Override
public String toString() {
return "Player{" + "name=" + name + ", prize=" + prize + '}';
}
}
以下是自定义的排序链表:
public class LeaderboardSortedLinkedList<T extends Comparable<T>> implements SortedListInterface<T> {
// 其他代码...
public boolean add(T newEntry) {
// 添加新元素的代码...
}
// 其他方法...
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;
}
}
}
要同时支持字符串和整数的排名,您可以修改 LeaderboardSortedLinkedList
类以存储 Player
对象,而不仅仅是整数。这样,您可以按照玩家的分数进行排序。以下是可能的修改:
public class LeaderboardSortedLinkedList implements SortedListInterface<Player> {
// 其他代码...
public boolean add(Player newEntry) {
// 添加新玩家的代码...
}
// 其他方法...
private class Node {
private Player data;
private Node next;
private Node(Player data) {
this.data = data;
next = null;
}
private Node(Player data, Node next) {
this.data = data;
this.next = next;
}
}
}
然后,您可以在 testLeaderboard
类中添加玩家对象并按照他们的分数排序:
public class testLeaderboard {
public static void main(String[] args) {
SortedListInterface<Player> Player = new LeaderboardSortedLinkedList();
Player.add(new Player("Player1", 1000000));
Player.add(new Player("Player2", 500000));
// 其他玩家的添加...
System.out.printf("=================================\n"
+ " Leaderboard\n"
+"=================================\n");
for(int i=0; i < Player.size(); i++){
Player currentPlayer = Player.get(i+1);
System.out.printf("%3d. %s\n",(i+1), currentPlayer.getName() + " - " + currentPlayer.getPrize());
}
}
}
这样,您就可以在排行榜中同时使用玩家姓名和分数了。
英文:
I am trying to do a Leaderboard for a game by using a Sorted Linked List. I was able to do so by sorting the point in descending order which mean higher point to lower point. Moreover, I will also need to put player name together with the point. The problem comes here. The SLL(Sorted Linked List) I implemented is an Integer data type, it works perfectly with the Integer data type as it sorted the numbers.
SortedListInterface<Integer> Player = new LeaderboardSortedLinkedList<Integer>();
But when I trying to put the player name which used String, it won't be able to do so because the point data type will need to follow the player name's data type.
Below are the codes of the driver class:
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));
}
}
}
Here is the Entity class
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 + '}';
}
}
Here's the custom Sorted Lineked List
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;
}
}
}
And the results is here
=================================
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
Here's my testing on the point with string data type because I can't think a way to use player name and point with 2 different data types at the same time in my custom ADT.
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);
}
And here's the result that it compare the first letter of the string.
8000
64000
500000
500
4000
32000
300
250000
2000
200
16000
125000
1000000
1000
100
Is there anyway to use both String and Integer in one ADT because if i couldn't do so, I won't be able sort the point. I'm so sorry for the long question. I am very new to data structures and algorithms so I really need some help on this. Much appreciate.
答案1
得分: 0
为了保持分数和名称的关联,您需要将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);
}
}
英文:
To keep the points and names together, you need to add Player objects into the list as they are, not just their points or their names:
SortedListInterface<Player> players = new LeaderboardSortedLinkedList<>();
players.add(new Player("Alpha", 1000000));
players.add(new Player("Beta", 500000));
players.add(new Player("Gamma", 250000));
For this to work, you will need to be able to compare Player objects by their point numbers. You do that by implementing the Comparable
interface and adding a compareTo
method.
You'll also want to add a toString()
method, so that you can print a Player object.
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);
}
}
答案2
得分: 0
感谢您帮助我,我成功地获得了所需的输出。但是出现了一个小问题,就是这个:
=================================
排行榜
=================================
1. name='Alpha' prize=1000000
2. name='Beta' prize=500000
3. name='Gamma' prize=250000
构建成功(总时间:1秒)
它以这种方式打印输出 [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; // 将 currentNode 移动到下一个节点
}
result = currentNode.data; // currentNode 指向给定位置的节点
}
return result;
}
英文:
Thank You for helping me I successfully get the output I want. But got a little problem which is this
=================================
Leaderboard
=================================
1. name='Alpha' prize=1000000
2. name='Beta' prize=500000
3. name='Gamma' prize=250000
BUILD SUCCESSFUL (total time: 1 second)
It print the output at this way [name="Alpha"]. Im not sure what is the problem but i guess it's my System.out.print code.
System.out.printf("%3d. %s\n",(i+1), players.get(i+1));
and here's my .get() function.
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;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论