Comment comparer les caractères de chaîne en utilisant flux?

Mefisto_Fell:

J'étudier le flux, je rencontrais une question. J'ai une liste que je besoin de trier par la longueur de la chaîne, toutes les chaînes où il y a un match de caractères en majuscules, s'il n'y a pas tel, puis les trier par ordre alphabétique.

List<String> phones = new ArrayList<>();
Collections.addAll(phones, "iPhone X", "Nokia 9", "Huawei Nexus 6P",
        "Samsung Galaxy S8", "LG G6", "Xiaomi MI6", "Sony Xperia Z5",
        "Asus Zenfone 3", "Meizu Pro 6", "Heizu Pro 6",
        "pixel 2");

phones.stream().filter(s -> s.matches("A-Z")).sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);

J'essaie d'utiliser des allumettes, mais je fais une erreur quelque part de, puisque rien est sortie. Comment puis-je réparer cela?

aussi:

Peu de choses à réparation il y aurait, vous devez vous assurer qu'il ya deux catégorisations différentes de chaînes, celui qui a une lettre majuscule et un autre qui ne fonctionne pas. Pour cela, vous pouvez partitionner votre liste comme:

Map<Boolean, List<String>> partitionedValues = phones.stream()
        .collect(Collectors.partitioningBy(a -> containsUpperCase(a)));

où la containsUpperCasemise en œuvre serait simplement ressembler à :

boolean containsUpperCase(String value) {
    for (char ch : value.toCharArray()) {
        if (Character.isUpperCase(ch)) {
            return true;
        }
    }
    return false;
}

Une fois que vous avez partitionné les données en tant que tel, vous devez regrouper ces derniers dans une seule liste finale:

List<String> finalOutput = partitionedValues.get(Boolean.TRUE) // with upper case
        .stream()
        .sorted(Comparator.comparing(String::length)) // sorted by length
        .collect(Collectors.toList());

finalOutput.addAll(partitionedValues.get(Boolean.FALSE) // without uppercase
        .stream()
        .sorted(Comparator.naturalOrder()) // sorted naturally
        .collect(Collectors.toList()));

votre sortie finale serait alors visible:

finalOutput.forEach(System.out::println);

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=203769&siteId=1
conseillé
Classement