[英]How to sort a list by alfabetical order depending on last letter of word?
So I have this list grades: [exA,exB,exC,inA,inB,inC,orA,orB,orC].所以我有这个列表等级:[exA,exB,exC,inA,inB,inC,orA,orB,orC]。 I want to sort that list by the last element in the index by alphabetical order.我想按字母顺序按索引中的最后一个元素对该列表进行排序。 I want it to look like [exA,inA,orA,exB,inB,orB,exC,inC,orC].我希望它看起来像 [exA,inA,orA,exB,inB,orB,exC,inC,orC]。 This is what I have tried.这是我尝试过的。 I need it in alphabetical order so I can find the best subject.我需要它按字母顺序排列,这样我才能找到最好的主题。 Then I can just say that the first element in the list is the best performance in a subject.那么我只能说列表中的第一个元素是一个主题中的最佳表现。 If I have duplicates I'll just pick a random subject of those subjects where I got a A.如果我有重复,我会从那些我得 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();
}
You can use a custom comparator.您可以使用自定义比较器。 For example with a Stream:例如,使用 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);
will print: [exA, exB, exC]将打印:[exA,exB,exC]
Really quick example, not effective and it only sorts by last char of the item not considering other letters so inA
can be before exA
.非常简单的示例,无效,它仅按项目的最后一个字符排序,不考虑其他字母,因此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);
}
}
It's not completely clear to me what you're looking for as you duplicated your previous post without providing any additional details, but this will (1) sort by the last character and then (2) apply a traditional sort (ensuring it will appear as "exA", "inA", "orA").我并不完全清楚您在寻找什么,因为您复制了之前的帖子而没有提供任何其他详细信息,但这将 (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.