2014-12-03 1 views
1

У меня есть два больших массива строк. Я хочу удалить элементы из первого массива, которые не существуют во втором массиве. Сначала я создать два массива:Java: Как эффективно удалить строки из массива, которые не существуют во втором массиве?

Массив для изменения:

String[] sarr = fdata.split(System.getProperty("line.separator")); 
ArrayList<String> items = new ArrayList(Arrays.asList(sarr)); 

Фильтр массива:

List<String> filter = new ArrayList<String>(); 
filter = Arrays.asList(voc.split(System.getProperty("line.separator"))) 

Затем я создаю итератор для перебора элементов items массива и проверьте, существует ли повторяющийся элемент в массиве filter, если это так, удалите его с items:

Iterator<String> it = items.iterator(); 

while (it.hasNext()) { 
    String s = it.next(); 
    if (!filter.contains(s)) { 
     it.remove(); 
    } 
} 

items массивы содержит 286,568 строк и filter содержит 100000 строк. Похоже, что операция занимает слишком много времени, поэтому я не делаю этого эффективно. Есть ли более быстрый способ?

ответ

6

Просто используйте разные типы коллекций. Для фильтра используйте HashSet для O(1) (instad O(n) для ArrayList) сложность поиска, а для предметов используйте LinkedList вместо ArrayList - что будет более эффективным для операций удаления.

Я не проверял этот код, но ...

String[] sarr = fdata.split(System.getProperty("line.separator")); 
LinkedList<String> items = new LinkedList(Arrays.asList(sarr)); 

Set<String> filter = new HashSet<String>(); 
filter = new HashSet(Arrays.asList(voc.split(System.getProperty("line.separator")))); 
items.retainAll(filter); 
+0

ничего себе, это намного быстрее! – minerals

+0

Это может быть даже немного быстрее, в зависимости от того, что вы пытаетесь добиться; вы также можете использовать 'HashSet' для элементов, если вам не нужен порядок элементов или повторяющиеся значения. – Elist

+0

@minerals Важно, чтобы вы узнали о базовых структурах данных, чтобы понять, почему они эффективнее – Dici

3

При вызове collection.contains(element) часто для большой коллекции, вы не должны использовать ArrayList, но скорее HashSet.

Set<String> filter = new HashSet<>(); 
Collections.addAll(filter, voc.split(System.getProperty("line.separator"))); 

HashSet оптимизированная структура данных для поиска вещей.

Смежные вопросы