簡體   English   中英

如何鏈接 java 中的兩個列表?

[英]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[] (數組)更適合您需求的數據結構。 我在這里的假設是您只需要在特定點對其進行排序,否則您將保持某種順序。 我們沒有足夠的信息來確定問題中的那個。

為了以您要求的格式打印出字符串。 我已經覆蓋了ScoreDetailstoString()方法,因此許多常見的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM