如何 link java 中的两个列表?

How to link two lists in java?

我正在尝试在程序中创建一种高分系统。我有一个分数列表,然后是一个名称列表。我想将分数和名称添加到 ArrayList 的末尾,然后使用集合对分数列表进行排序。问题是我需要以完全相同的方式对名称列表进行排序。

开始 [1, 3, 2] [“姓名 1”、“姓名 2”、“姓名 3”]

已排序 [3, 2, 1] [“姓名 2”、“姓名 3”、“姓名 1”]

就像那样。

您可以将每个名称作为 int 映射到一个等级,然后按值对映射进行排序

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);

您可以尝试存储一个包含名称和分数的对象列表,而不是将它们存储在单独的列表中。然后你可以通过你的比较器来使用分数对列表进行排序。

为什么不创建一个处理名称和分数的“playerScore”对象,并将该对象放入数组中,并使用“getScore()”方法进行排序? 这样,您将始终只有一个列表和一个要处理的对象。 如果你使用地图来放置名字并使用分数作为地图中的价值,你会遇到两个相同分数的玩家的问题,例如,请注意这一点。

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() 方法,因此许多常见的输出函数将显示您正在寻找的内容。

我会将您的记分牌存储在 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}