如何 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}
我正在尝试在程序中创建一种高分系统。我有一个分数列表,然后是一个名称列表。我想将分数和名称添加到 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}