[英]How to link two lists in java?
我正在嘗試在程序中創建一種高分系統。 我有一個分數列表,然后是一個名字列表。 我想將分數和名稱添加到 ArrayList 的末尾,然后使用 collections 對分數列表進行排序。 問題是我需要以完全相同的方式對名稱列表進行排序。
開始 [1, 3, 2] ["name 1", "name 2", "name 3"]
排序 [3, 2, 1] ["name 2", "name 3", "name 1"]
像那樣。
您可以將 map 每個名稱作為 int 進行排序,然后按值對 map 進行排序
import Java.util.HashMap;
HashMap<String, Integer> scoresMap = new HashMap<String, Integer>();
//add a value into a map like this
scoresMap.put("name 1", 3);
//then make a function to sort the map
HashMap<String, Integer> sortedScoresMap;
sortedScoresMap = sortMapByValue(scoresMap);
您可能應該使用Map
- Map javadoc 。
我會使用username
作為鍵,你可以輸入分數作為value
。
Map<String, Integer> scores = new HashMap<>();
要插入新分數,請使用:
if (!score.keySet().contains("username")) score.put("username", 10);
迭代和更新:
if (score.keySet().contains("username")) score.replace("username", newScore);
您可以嘗試存儲包含名稱和分數的 object 列表,而不是將它們存儲在單獨的列表中。 然后,您可以通過比較器來使用分數對列表進行排序。
為什么不創建一個處理名稱和分數的“playerScore”object,並將這個 object 放入數組中,並使用“getScore()”方法進行排序? 這樣,您將始終只有一個列表和一個 object 來處理它。 如果你使用 map 在 map 中輸入名稱和使用分數作為值,你會遇到兩個相同分數的玩家的問題,例如,注意這一點。
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class so65891032 {
public static void main(String[] args) {
List<ScoreDetails> scores = new ArrayList<>();
//Add scores using add()
var sortedScores = scores.stream()
.sorted()//Uses comparable, use this one or one below
.sorted(ScoreDetails.SCORE_COMPARATOR)//Uses Comparator
.collect(Collectors.toList());
}
}
class ScoreDetails implements Comparable<ScoreDetails> {
public static final Comparator<ScoreDetails> SCORE_COMPARATOR = new Comparator<ScoreDetails>() {
@Override
public int compare(ScoreDetails o1, ScoreDetails o2) {
return o1.score - o2.score;
}
};
public String name;
public int score;
@Override
public String toString() {
return name + " " + score; //Will print out in the format you are looking for
}
@Override
public int compareTo(ScoreDetails other) {
return score - other.score;
}
}
使用流可以進行排序。 sorted 方法可以采用可以匿名定義的比較器,或者如果您打算重復使用它,您可以將其存儲為常量。 在這里,我讓它變得簡單,只是在ScoreDetail
class 上實現了Comparable
。
另一點,如果您想始終確保它按分數排序,您可能需要考慮一種比List
或[]
(數組)更適合您需求的數據結構。 我在這里的假設是您只需要在特定點對其進行排序,否則您將保持某種順序。 我們沒有足夠的信息來確定問題中的那個。
為了以您要求的格式打印出字符串。 我已經覆蓋了ScoreDetails
的toString()
方法,因此許多常見的 output 函數將顯示您要查找的內容。
我會將您的記分牌存儲在 Map 中,其中鍵是名稱,值是分數而不是兩個列表。
然后這個 map 按值排序
Map<String, Integer> scoreboard = new HashMap<>();
scoreboard.put("name 1", 1);
scoreboard.put("name 2", 3);
scoreboard.put("name 3", 2);
LinkedHashMap<String, Integer> sortedScoreboard = scoreboard.entrySet()
.stream()
.sorted(Map.Entry.<String, Integer> comparingByValue().reversed())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));
結果:
{name 2=3, name 3=2, name 1=1}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.