Проверка Java Массив дублирования элементов существует без использования циклов? - PullRequest
2 голосов
/ 20 марта 2019

Я сделал детектор парных слов, который дает мне вывод true или false.
Если значение в массиве строк содержит ту же строковую букву (дублирование), то вернется true.
Я использовал приведенный ниже код с использованием вложенных циклов
Теперь я хочу реализовать ту же концепцию без использования каких-либо циклов?
Как я могу это сделать, какие-либо примеры или какой тип java collection framework необходим?
Спасибо

Main:

public class Main                                       
{                                       
  public static void main(String[] args)                                        
  {                                     
    String[] box = {"Monkey","Lion","Elephant","Zebra","Tiger", "Hippo"};                                       
    String[] box2 = {"Shop","Biscuit","Cake","Cake"};                                       
    String[] box3 = {"Entrance","Gate","Price","Door","Gate"};
    String[] box4 = {"Female","Male"};                                      
    System.out.println(Pairfinder.test(box));        //false                                
    System.out.println(Pairfinder.test(box2));       //true                                 
    System.out.println(Pairfinder.test(box3));       //true  
    System.out.println(Pairfinder.test(box4));       //false                            
  }                                     
}

Sub:

public class Pairfinder                                     
{                                       
  public static boolean test(String[] value)                                        
  {                                     
    for (int i = 0; i < value.length; i++) {                                        
            for (int j = 0; j < value.length; j++) {                                        
                if (value[i].equals(value[j]) && i != j) {                                      
                    return true;                                        
                }                                       
            }                                       
        }                                       
        return false;                                       
    }                                       
}

Ответы [ 3 ]

1 голос
/ 20 марта 2019

Вы можете использовать потоки Java с одним слоем:

public static boolean test(String[] value) {
    return Arrays.stream(value).anyMatch(v -> Collections.frequency(Arrays.asList(value), v) > 1);
}

Но это, вероятно, не самое эффективное решение, поскольку оно имеет временную сложность O (n²).

В качестве альтернативы вы можете использовать distinct():

public static boolean test(String[] value) {
    return Arrays.stream(value).distinct().count() < value.length;
}

Если вы хотите получить повторяющиеся значения, вы можете комбинировать оба метода:

public static String[] getDuplicates(String[] value) {
    return Arrays.stream(value)
            .filter(v -> Collections.frequency(Arrays.asList(value), v) > 1)
            .distinct()
            .toArray(String[]::new);
}

Эта версия также имеет временную сложность O(n²) из-за количества frequency().Лучшее решение было бы:

public static String[] getDuplicates(String[] value) {
    return Arrays.stream(value)
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
            .entrySet().stream()
            .filter(e -> e.getValue() > 1)
            .map(Map.Entry::getKey)
            .toArray(String[]::new);
}
1 голос
/ 20 марта 2019

Вот простой пример для вашего дела

public static void main(String[] args) {
    String[] box = {"Monkey", "Lion", "Elephant", "Zebra", "Tiger", "Hippo"};
    String[] box2 = {"Shop", "Biscuit", "Cake", "Cake"};
    String[] box3 = {"Entrance", "Gate", "Price", "Door", "Gate"};
    String[] box4 = {"Female", "Male"};
    System.out.println(checkIt(box));        //false                                
    System.out.println(checkIt(box2));       //true                                 
    System.out.println(checkIt(box3));       //true  
    System.out.println(checkIt(box4));           //false   

}

public static boolean checkIt(String[] text) {
    return !Arrays.stream(text).allMatch(new HashSet<>()::add);
}
0 голосов
/ 20 марта 2019

Да, вы можете сделать это, используя HashSet с временной сложностью O (n)
Идея в том, что
Поместите все предметы в HashSet
Если array содержит повторяющиеся значения
Длина HashSet не будет равна длине array
Поскольку add function из HashSet добавит указанный элемент к этому набору, если он еще не существует

public static boolean test(String[] value) {
    Set<String> hashSet = new HashSet<>(Arrays.asList(value));
    return (value.length != hashSet.size());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...