[英]How to sort an list first letter ascending and last letter decending in java?
[英]How to sort a list by alfabetical order depending on last letter of word?
所以我有这个列表等级:[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();
}
您可以使用自定义比较器。 例如,使用 Stream:
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]
非常简单的示例,无效,它仅按项目的最后一个字符排序,不考虑其他字母,因此inA
可以在exA
之前。
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.stream.Collectors;
public class TestOrder {
@Test
public void test() {
// given
var input = Lists.list("exA", "exB", "exC", "inA", "inB", "inC", "orA", "orB", "orC");
// when
var result = input.stream().sorted((word1, word2) -> {
char lastLetterOfFirstWord = word1.charAt(word1.length() - 1);
char lastLetterOfSecondWord = word2.charAt(word2.length() - 1);
return lastLetterOfFirstWord - lastLetterOfSecondWord;
}).collect(Collectors.toList());
// then
var expectedOutput = Lists.list("exA", "inA", "orA", "exB", "inB", "orB", "exC", "inC", "orC");
Assertions.assertEquals(expectedOutput, result);
}
}
我并不完全清楚您在寻找什么,因为您复制了之前的帖子而没有提供任何其他详细信息,但这将 (1) 按最后一个字符排序,然后 (2) 应用传统排序(确保它将显示为“exA”、“inA”、“orA”)。
List<String> list = Arrays.asList("exB", "inA", "inC", "inB", "exC", "orA", "orB", "exA", "orC");
List<String> sortedList = list.stream()
.sorted(Comparator.comparing((String string) -> string.charAt(string.length() - 1))
.thenComparing(Comparator.naturalOrder()))
.collect(Collectors.toList());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.