如何对数组中不断更新的(动态)对象进行排序 [英] How to sort a continuously updated (dynamic) object in an array
问题描述
我正在构建经典的Nim游戏.到目前为止,我已经完成了玩家部分和游戏部分.现在,我正在尝试对数组中的对象进行排序(排序).我已经建立了以下排序对象:
I am building a classical Nim game. So far, I've done the player part and the game part. Now, I am trying to sort(rank) the object in an array. I've built the following for sorting:
-
playerList
-
winRatio
,该类在NimPlayer
类中使用其吸气剂进行设置.
playerList
winRatio
, which is set in theNimPlayer
class with its getter.
目标:
- 对
winRatio
进行降序排序,这意味着从最高分到最低分.该比率由score/gamePlayed
计算. - 如果有平局,请按字母顺序使用
userName
进行排序.
- to sort the
winRatio
descendingly, which means from the highest score to the lowest one. The ratio is calculated byscore/gamePlayed
. - If there's a tie, sort using
userName
alphabetically.
我已经提到了这个问题:如何排序Java中的对象数组?
I've referred to this issue: How to sort an array of objects in Java?
我知道我应该做的是使用Comparable
或Comparator
进行排序,但是从本文开始,它们使用对象中的属性进行排序(到目前为止,我找到的所有信息).我要处理的是构造函数外部的不断更新的数据.
I know what I should do is use the Comparable
or Comparator
for sorting but from the article, they sort using the attributes in the object (All the information I've found so far). What I am dealing with is the continuously updated data outside the constructor.
我尝试过的是直接打印出数据而不进行排序.
What I've tried was directly printed out the data without sorting.
这是我的相关代码(NimPlayer
):
Here is my related code (NimPlayer
):
public class NimPlayer {
private String userName;
private String familyName;
private String givenName;
static int counter;
private int score;
private int gamePlayed;
static NimPlayer[] playerList = new NimPlayer[2]; // set an array here
//define NimPlayer data type
public NimPlayer(String userName, String surName, String givenName) {
this.userName = userName;
this.familyName = surName;
this.givenName = givenName;
}
// create new data using NimPlayer data type
public static void createPlayer(String userName, String familyName, String givenName) {
if (counter<10) {
playerList[counter++] = new NimPlayer(userName, familyName, givenName);
} else {
System.out.println("Cannot add more players.");
}
// all the getter and setter related to the constructor; the getter of the player list.
}
public void setScore(int score) {
this.score=score;
}
public int getScore() {
return score;
}
public void setGamePlayed (int gamePlayed) {
this.gamePlayed = gamePlayed;
}
public int getGamePlayed() {
return gamePlayed;
}
public int getWinRatio () {
return Math.round(Float.valueOf(getScore())/ (getGamePlayed()+1)*100) ;
}
}
这是我的主班(Nimsys
)
public static void searchAndPrintRankingData() {
for (int i = 0; i < NimPlayer.getCounter(); i++) {
String familyName = NimPlayer.getPlayer()[i].getFamilyName();
String givenName = NimPlayer.getPlayer()[i].getGivenName();
int score = NimPlayer.getPlayer()[i].getScore();
int gamePlayed = NimPlayer.getPlayer()[i].getGamePlayed();
double winRatio = score/(gamePlayed+1);//wrong calculation for testing
System.out.println(winRatio+"% | "+gamePlayed+" games | "+givenName+" "+familyName);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (true) {
System.out.print('$');
String commandin = in.next();
if (commandin.equals("rankings")) {
String commandOrder = in.nextLine().trim();
if (commandOrder.equals("asc")) {
//sort the data
searchAndPrintRankingData();
}
if (commandOrder.equals("") || commandOrder.equals("desc")) {
//sort the data
searchAndPrintRankingData();
}
}
}
我们非常感谢您的帮助.
Any help is highly appreciated.
推荐答案
使用接口比较器
执行以下操作:
Use Interface Comparator
Do it as follows:
import java.util.Arrays;
import java.util.Comparator;
class NimPlayer {
private String userName;
private String familyName;
private String givenName;
private static int counter;
private static final int SIZE = 4;
private int score;
private int gamePlayed;
static NimPlayer[] playerList = new NimPlayer[SIZE];
public NimPlayer(String userName, String surName, String givenName) {
this.userName = userName;
this.familyName = surName;
this.givenName = givenName;
}
public static void createPlayer(String userName, String familyName, String givenName) {
if (counter < SIZE) {
playerList[counter++] = new NimPlayer(userName, familyName, givenName);
} else {
System.out.println("Cannot add more players.");
}
}
public static int getCounter() {
return counter;
}
public static NimPlayer[] getPlayerList() {
return playerList;
}
public String getUserName() {
return userName;
}
public String getFamilyName() {
return familyName;
}
public String getGivenName() {
return givenName;
}
public void setScore(int score) {
this.score = score;
}
public int getScore() {
return score;
}
public void setGamePlayed(int gamePlayed) {
this.gamePlayed = gamePlayed;
}
public int getGamePlayed() {
return gamePlayed;
}
public int getWinRatio() {
return Math.round((Float.valueOf(score) / gamePlayed) * 100);
}
@Override
public String toString() {
return "User Name: " + userName + ", Name: " + givenName + " " + familyName + ", Score: " + score
+ ", Games Played: " + gamePlayed + ", Win ratio: " + getWinRatio();
}
}
public class Main {
static void searchAndPrintRankingData() {
NimPlayer[] players = NimPlayer.getPlayerList();
Arrays.sort(players,
Comparator.comparing((NimPlayer::getWinRatio)).reversed().thenComparing(NimPlayer::getUserName));
Arrays.stream(players).forEach(System.out::println);
}
public static void main(String[] args) {
NimPlayer.createPlayer("Avi", "Avinash", "Arvind");
NimPlayer.createPlayer("Harry", "Potter", "Harry");
NimPlayer.createPlayer("Vishy", "Anand", "Vishwanathan");
NimPlayer.createPlayer("Bond", "Bond", "James");
NimPlayer[] players = NimPlayer.getPlayerList();
players[0].setGamePlayed(2);
players[0].setScore(40);
players[1].setGamePlayed(3);
players[1].setScore(75);
players[2].setGamePlayed(2);
players[2].setScore(120);
players[3].setGamePlayed(4);
players[3].setScore(100);
System.out.println("Unsorted: ");
Arrays.stream(NimPlayer.getPlayerList()).forEach(System.out::println);
System.out.println();
System.out.println("Sorted on win ratio (then name, in case of tie): ");
searchAndPrintRankingData();
}
}
输出:
Unsorted:
User Name: Avi, Name: Arvind Avinash, Score: 40, Games Played: 2, Win ratio: 2000
User Name: Harry, Name: Harry Potter, Score: 75, Games Played: 3, Win ratio: 2500
User Name: Vishy, Name: Vishwanathan Anand, Score: 120, Games Played: 2, Win ratio: 6000
User Name: Bond, Name: James Bond, Score: 100, Games Played: 4, Win ratio: 2500
Sorted on win ratio (then name, in case of tie):
User Name: Vishy, Name: Vishwanathan Anand, Score: 120, Games Played: 2, Win ratio: 6000
User Name: Bond, Name: James Bond, Score: 100, Games Played: 4, Win ratio: 2500
User Name: Harry, Name: Harry Potter, Score: 75, Games Played: 3, Win ratio: 2500
User Name: Avi, Name: Arvind Avinash, Score: 40, Games Played: 2, Win ratio: 2000
注意::如果您希望在searchAndPrintRankingData
中使用ArrayList<NimPlayer>
,则下面是相同的代码:
Note: In case you wish to use ArrayList<NimPlayer>
in searchAndPrintRankingData
, given below is the code for the same:
static void searchAndPrintRankingData() {
List<NimPlayer> players = new ArrayList<NimPlayer>(Arrays.asList(NimPlayer.getPlayerList()));
Collections.sort(players,
Comparator.comparing((NimPlayer::getWinRatio)).reversed().thenComparing(NimPlayer::getUserName));
players.stream().forEach(System.out::println);
}
这篇关于如何对数组中不断更新的(动态)对象进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!