首页 > 解决方案 > 如何根据单词的最后一个字母按字母顺序对列表进行排序?

问题描述

所以我有这个列表等级:[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();
}

标签: java

解决方案


您可以使用自定义比较器。例如使用流:

    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]


推荐阅读