java - 如何根据单词的最后一个字母按字母顺序对列表进行排序?
问题描述
所以我有这个列表等级:[exA,exB,exC,inA,inB,inC,orA,orB,orC]。我想按字母顺序按索引中的最后一个元素对该列表进行排序。我希望它看起来像 [exA,inA,orA,exB,inB,orB,exC,inC,orC]。这是我尝试过的。我需要它按字母顺序排列,这样我才能找到最好的主题。那么我只能说列表中的第一个元素是一个主题中的最佳表现。如果我有重复,我会从那些我得 A 的科目中随机选择一个科目。
private List <String> bestSubjectsList = new ArrayList <>();
private List <String> bestDuplicateGrades = new ArrayList <>();
private String bestSubjectId;
private String bestSubjectCode;
public void setBestSubject(List <String> grades) {
bestSubjectsList.clear();
bestDuplicateGrades.clear();
bestSubjectId = "";
bestSubjectCode = "NO BEST!";
if (!grades.isEmpty()) {
for (int i = 0; i < grades.size(); i++) {
if (grades.get(i).contains("A")) {
bestSubjectsList.add(grades.get(i));
bestDuplicateGrades.add("A");
}
else if (!bestSubjectsList.contains("A") && grades.get(i).contains("B")) {
bestSubjectsList.add(grades.get(i));
bestDuplicateGrades.add("B");
}
else if (!bestSubjectsList.contains("B") && grades.get(i).contains("C")) {
bestSubjectsList.add(grades.get(i));
bestDuplicateGrades.add("C");
}
else if (!bestSubjectsList.contains("C") && grades.get(i).contains("D")) {
bestSubjectsList.add(grades.get(i));
bestDuplicateGrades.add("D");
}
else if (!bestSubjectsList.contains("D") && grades.get(i).contains("E")) {
bestSubjectsList.add(grades.get(i));
bestDuplicateGrades.add("E");
}
else if (!bestSubjectsList.contains("E") && grades.get(i).contains("F")) {
bestSubjectsList.add(grades.get(i));
bestDuplicateGrades.add("F");
}
}
Random rand = new Random();
Set<String> set = new HashSet<>(bestDuplicateGrades);
// Sjekker duplikater
if(set.size() < bestDuplicateGrades.size() && !bestDuplicateGrades.get(0).equals("F")){
bestSubjectId = bestSubjectsList.get(rand.nextInt(bestSubjectsList.size()));
}
else {
bestSubjectId = bestSubjectsList.get(bestSubjectsList.size() - 1);
if (bestSubjectId.contains("F")){
bestSubjectId = "";
}
}
if (!bestSubjectsList.isEmpty() && !bestSubjectId.equals("")) {
String reducedId = bestSubjectId.substring(0, bestSubjectId.length() - 1);
if (reducedId.equals("ex")) {
bestSubjectCode = "EXPH0300";
}
else if (reducedId.equals("in")) {
bestSubjectCode = "TDT4109";
}
else if (reducedId.equals("ma")) {
bestSubjectCode = "TMA4100";
}
else if (reducedId.equals("di")) {
bestSubjectCode = "TMA4140";
}
else if (reducedId.equals("ob")) {
bestSubjectCode = "TDT4100";
}
else if (reducedId.equals("or")) {
bestSubjectCode = "TIØ4101";
}
else if (reducedId.equals("ma3")) {
bestSubjectCode = "TMA4115";
}
else if (reducedId.equals("kom")) {
bestSubjectCode = "TTM4100";
}
else {
bestSubjectCode = "NO BEST!";
}
}
else {
bestSubjectCode = "NO BEST!";
}
}
System.out.println(bestSubjectsList);
System.out.println(bestDuplicateGrades);
System.out.println(bestSubjectId);
System.out.println(bestSubjectCode);
System.out.println(bestSubjectsList);
System.out.println();
}
解决方案
您可以使用自定义比较器。例如使用流:
List<String> list = List.of("exB", "exC", "exA");
List<String> sorted = list.stream()
.sorted(Comparator.comparing(s -> s.charAt(s.length() - 1)))
.collect(Collectors.toList());
Assertions.assertThat(sorted).containsExactly("exA","exB","exC");
System.out.println(sorted);
将打印:[exA,exB,exC]
推荐阅读
- python - 如何在打开 PIL 图像时引发异常之前删除目录?
- angular - 为什么我的 Angular Async/Await 循环在为每个索引执行之前退出?
- c - 为什么我的代码在这个问题中不能正常工作
- python - 如果在 Python 中选中复选框,则从 HTML 表中删除记录
- reactjs - 尝试从我的 api 映射数据时,对象作为 React 子项无效
- kubernetes - Kfserving 示例问题 -- 配额失败:kf-resource-quota:必须指定内存
- python - Dijkstra 在 python 中的算法实现跟踪
- python - 如何将元素从 python pandas 数据帧循环到新的嵌套字典?
- chaos - 石蕊混沌实验状态失败步骤:混沌注入阶段失败
- python - 金字塔安全认证请求