【问题标题】:How to link two lists in java?如何在java中链接两个列表?
【发布时间】:2021-04-29 15:04:31
【问题描述】:

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

开始 [1, 3, 2] ["名字 1" , "名字 2" , "名字 3"]

已排序 [3, 2, 1] ["名称 2" , "名称 3" , "名称 1"]

这样。

【问题讨论】:

标签: java arraylist hashmap grouping


【解决方案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);

【讨论】:

  • 你能举例说明如何做到这一点。我有点缺乏经验。
  • 这非常有帮助。我会试试这个。
【解决方案2】:

您可能应该使用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);

【讨论】:

  • 如果 2 人获得相同的分数,这项工作是否可行。
【解决方案3】:

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

【讨论】:

  • 可能想举一个例子。但同意了。
【解决方案4】:

为什么不创建一个处理名称和分数的“playerScore”对象,并将该对象放入数组中,并使用“getScore()”方法进行排序? 这样,您将始终只有一个列表和一个要处理的对象。 如果你用map来放名字,用score作为map中的值,那么两个同分的玩家会有问题,比如这个,要小心。

【讨论】:

  • 是的,我想过创建一个播放器对象并这样做,但我想知道是否有更好的方法。
  • @CadeBarfield 更好的方法是解决您的问题。
【解决方案5】:
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 类上实现了Comparable

另外一点,如果您想始终确保按分数排序,您可能需要考虑比List[](数组)更适合您需求的数据结构。我在这里的假设是您只需要在特定点对其进行排序,否则您将保持某种顺序。我们没有足够的信息来确定问题所在。

为了以您要求的格式打印出字符串。我已经为ScoreDetails 覆盖了toString() 方法,因此许多常见的输出函数将显示您要查找的内容。

【讨论】:

    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多