2013-12-16 2 views
2

Есть ли возможность сравнить два массива без двух петель? У меня есть два массива со строками и нужно подсчитать количество равных элементов. (Длина массивов может быть различной)Элементы count, если в обоих массивах

+0

Если вы хотите/нужно сравнить все элементы из массива со всеми элементами из другого массива, то вам нужно две петли (или рекурсивные методы, могут быть заменены петлями). Кроме того, вы можете использовать 'Map ' для хранения 'String' и счетчика для каждой записи. –

+0

Нет. Если они не равны по размеру, необходимо использовать две петли. –

+0

Предположим, что все элементы уникальны в каждом массиве, добавьте все элементы в набор, а затем работайте с размером набора. –

ответ

1

нравится этот

String[] a ={"A","B"}; 
String[] b={"A","B","C"}; 
List<String> list=new ArrayList<String>(); 
list.addAll(Arrays.asList(a)); 
list.retainAll(Arrays.asList(b)); 
System.out.println(list); 
System.out.println("equal elements:"+list.size()); 

выход

[A, B] 
equal elements:2 
+0

отлично работает с неповторимыми элементами – user3107896

0

Вы можете использовать Arrays.asList(...).contains(...) и для каждого результата "true" приратить к успеху счетчик (cont++);

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

+1

Это внутренне использует 'loop', чтобы проверить, содержит ли этот список элемент ... –

+0

Я понял, что он не хочет явно использовать циклы –

0

В принципе, нет. Вы должны использовать по крайней мере две вложенные петли (for, while, do-while) или другие методы, такие как рекурсивные методы, имитирующие петли, но в конце вы будете использовать два. Даже если вы используете List#contains (как указано в RafaRomero's answer), вы используете два вложенных цикла, а не явно, но они есть.

Другой вариант может использовать Set<String> для хранения String и если элемент уже находится в Set, то ваш счетчик добавит 1 значение. Обратите внимание, что этот вариант будет использовать два не вложенные петли:

public int countEqualElements(String[] yourFirstStringArray, String[] yourSecondStringArray) { 
    Set<String> mainData = new HashSet<String>(); 
    int counter = 0; 
    for (String string : yourFirstStringArray) { 
     mainData.add(string); 
    } 
    for (String string : yourSecondStringArray) { 
     if (!mainData.add(string)) { 
      counter++; 
     } 
    } 
    return counter; 
} 
3

Предположив, что все элементы являются уникальными в каждом массиве:

String[] a ={"A","B", "E"}; 
String[] b={"A","B","C", "D", "E"}; 

Set<String> set = new HashSet<String>(); 
set.addAll(Arrays.asList(a)); 
set.addAll(Arrays.asList(b)); 

System.out.println("nb of equal elements "+ (a.length + b.length - set.size())); 

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

+0

Мне нравится эта идея. Использование 'Set' для решения этой проблемы обеспечивает очень элегантное решение. +1. – christopher

0

Используя набор метод в коллекции (уникальные значения)

String[] arrayA = new String[] {"A", "B", "C"}; 
    String[] arrayB = new String[] { "B", "C", "D"}; 
    Set<String> setA= new HashSet<String>(Arrays.asList(arrayA)); 
    Set<String> setB= new HashSet<String>(Arrays.asList(arrayB)); 
    setA.retainAll(setB); 
    System.out.println(setA.size()); 
Смежные вопросы