Удалить чувствительные к регистру повторяющиеся элементы из списка в java - PullRequest
1 голос
/ 27 мая 2020

Итак, у меня есть список таких строк, как {"a", "A", "b", "B", "C", "D", "d", "E"}

Мое требование состоит в том, что я хочу удалить повторяющиеся элементы из этой строки. Вначале я укажу, будут ли элементы, которые будут рассматриваться для удаления, в нижнем или верхнем регистре. Но я хочу знать гораздо лучший подход к достижению этого, используя java.

Это мой подход:

String [] str = {"a", "A", "b" , «B», «C», «D», «d», «E»}; HashSet s = новый HashSet ();

    for (String alphabet : str) {

        if (alphabet.equals(alphabet.toUpperCase())) {

            s.add(alphabet);
        }
    }       

    System.out.println(s);

Ответы [ 4 ]

1 голос
/ 27 мая 2020

Сделайте следующее:

import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String[] str = { "a", "A", "b", "B", "C", "D", "d", "E" };
        int option = 1;// `0` for lowercase and `1` for UPPERCASE
        Set<String> set;
        if (option == 0) {
            set = Arrays.stream(str).map(String::toLowerCase).collect(Collectors.toSet());
        } else {
            set = Arrays.stream(str).map(String::toUpperCase).collect(Collectors.toSet());
        }

        // Display
        System.out.println(set);
    }
}

Вывод:

[A, B, C, D, E]
1 голос
/ 27 мая 2020

Для справки в будущем включите любой код, который вы уже пробовали. Поскольку вы этого не сделали, я объясню некоторые из возможных способов.

A for l oop определенно самый простой (и поправьте меня, если я неправильный, самый быстрый) способ сделать это. Вы можете использовать foreach l oop (for(thingContained name : groupOfContainedThings)) и проверить, есть ли разница между исходным символом и тем, для которого был вызван метод .toLowerCase(). если они разные, то это была заглавная буква.

Вместо этого вы также можете использовать .compareTo(String str) с указанным выше for l oop и проверить, равно ли значение 0 (без разницы). Подробнее об этом можно прочитать здесь . Это более универсальный вариант, и я рекомендую его, потому что он будет работать и с более длинными String сек!

0 голосов
/ 27 мая 2020

Проверьте этот код ниже.

Идея состоит в том, чтобы создать карту количества строк. Если элемент встречался один раз, добавьте его непосредственно в список исключенных дубликатов. Если это произошло более одного раза, вам необходимо проверить, какую версию элемента вы хотите сохранить (строчные или прописные).

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;

public class RemoveDuplicateCaseInsensitive {
    public static void main(String[] args) {
        List<String> inputList = Arrays.asList("a", "A", "b", "B", "C", "D", "d", "E");
        Scanner scanner = new Scanner(System.in);
        String caseToRemove = scanner.nextLine();
        System.out.println("caseToRemove is = " + caseToRemove); // to be inputted by user
        Map<String, Long> countMapOfString =
                inputList.stream().collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));

        System.out.println("countMapOfString is = " + countMapOfString);

        List<String> deDuplicatedStringList = new ArrayList<>();
        inputList.stream().forEach(element -> {
            // element which have occurred only once should be added straight away
            if (countMapOfString.get(element.toLowerCase()) == 1) {
                deDuplicatedStringList.add(element);
            } else {
                if (caseToRemove.equalsIgnoreCase("UpperCase")) { // want to remove uppercase
                    if (!deDuplicatedStringList.contains(element.toLowerCase())) {
                        deDuplicatedStringList.add(element.toLowerCase());
                    }
                } else if (caseToRemove.equalsIgnoreCase("LowerCase")) { // want to remove lowercase
                    if (!deDuplicatedStringList.contains(element.toUpperCase())) {
                        deDuplicatedStringList.add(element.toUpperCase());
                    }
                }
            }
        });
        System.out.println("deDuplicatedStringList is = " + deDuplicatedStringList);
    }
}

Когда вы запускаете с LowerCase в качестве входных данных, вывод программа:

caseToRemove is = LowerCase
countMapOfString is = {a=2, b=2, c=1, d=2, e=1}
deDuplicatedStringList is = [A, B, C, D, E]

Когда вы запускаете UpperCase в качестве входных данных, вывод программы будет

caseToRemove is = UpperCase
countMapOfString is = {a=2, b=2, c=1, d=2, e=1}
deDuplicatedStringList is = [a, b, C, d, E]

Надеюсь, это поможет.

0 голосов
/ 27 мая 2020

Рассмотрите возможность использования Set . Наборы не позволяют добавлять повторяющиеся элементы, и они чувствительны к регистру. Пример ниже:

HashSet<String> set = new HashSet<>();
set.add("A");
set.add("a");
set.add("b");
set.add("B");
set.add("C");
set.add("D");
set.add("d");
set.add("E");

set.add("E"); //duplicate element
set.add("e"); //not a duplicate element

System.out.println(set.toString());

Вывод:

[A, a, b, B, C, D, d, E, e]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...