简体   繁体   English

如何根据单词的最后一个字母按字母顺序对列表进行排序?

[英]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.

相关问题 如何在Java中对列表的第一个字母升序和最后一个字母降序进行排序? - How to sort an list first letter ascending and last letter decending in java? 设计一个比较器来命令单词,使每个单词的最后一个字母是下一个单词的第一个字母? - Designing a comparator to order words so that the last letter of each word is the first letter of the next word? 如何使单词的最后一个字母变为大写 - How to make the last letter of a word become capitalized 如何遍历字符串列表以将每个单词的最后一个字母更改为UpCase? - How do I iterate through a list of Strings to change the last letter of each word toUpperCase? 识别每个单词的最后一个字母 - Identify last letter of each word Java-对字符串列表进行排序,根据字符串的内容确定顺序 - Java - Sort a List of strings, determining the order depending on the contains of the string 如何从一个单词中按顺序获取所有一个和两个字母组合? - How to get all one and two letter combinations in order from a word? 如何在循环中显示单词,在每次迭代时删除最后一个字母 - How to display the Word in a Loop removing the last letter at each iteration 如何对具有指定属性和排序顺序的列表进行排序 - How to sort a list with specified property and sort order 检查单词的最后一个字母时,StringIndexOutOfBoundsException -1 - StringIndexOutOfBoundsException -1 when checking last letter of a word
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM