我需要在Java中创建一个检查两个字符列表的递归方法。 如果第二个列表至少一次包含第一个列表中的所有字符,并且顺序相同,则应返回true,否则应返回false。 例如: 列表1:“ abbcd”(节点中的每个字符),列表2:“ abbcccddd”(节点中的每个字符)这应该返回true ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我正在尝试在程序中创建一种高分系统。 我有一个分数列表,然后是一个名字列表。 我想将分数和名称添加到 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.