У меня есть два списка (не java-списки, можно сказать два столбца)
Например
**List 1** **Lists 2**
milan hafil
dingo iga
iga dingo
elpha binga
hafil mike
meat dingo
milan
elpha
meat
iga
neeta.peeta
Мне нужен метод, который возвращает количество одинаковых элементов. В этом примере должно быть 3, и он должен возвращать мне аналогичные значения как списка, так и разные значения.
Стоит ли использовать hashmap, если да, то каким методом получить результат?
Пожалуйста помоги
PS: Это не школьное задание :) Так что если вы меня просто поможете, этого будет достаточно
java
list
comparison
hashmap
user238384
источник
источник
Ответы:
РЕДАКТИРОВАТЬ
Вот две версии. Одно использование,
ArrayList
а другое использованиеHashSet
Сравните их и создайте из этого свою собственную версию, пока не получите то, что вам нужно.
Этого должно быть достаточно, чтобы покрыть:
часть вашего вопроса.
продолжая исходный ответ:
Вы можете использовать
java.util.Collection
и / илиjava.util.ArrayList
для этого.Метод keepAll выполняет следующие действия:
см. этот образец:
import java.util.Collection; import java.util.ArrayList; import java.util.Arrays; public class Repeated { public static void main( String [] args ) { Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta")); Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); listOne.retainAll( listTwo ); System.out.println( listOne ); } }
РЕДАКТИРОВАТЬ
Для второй части (аналогичные значения) вы можете использовать метод removeAll :
Эта вторая версия дает вам также аналогичные значения и повторяет дескрипторы (отбрасывая их).
На этот раз вместо a
Collection
может быть a (разница в том, что Set не позволяет повторять значения)Set
List
import java.util.Collection; import java.util.HashSet; import java.util.Arrays; class Repeated { public static void main( String [] args ) { Collection<String> listOne = Arrays.asList("milan","iga", "dingo","iga", "elpha","iga", "hafil","iga", "meat","iga", "neeta.peeta","iga"); Collection<String> listTwo = Arrays.asList("hafil", "iga", "binga", "mike", "dingo","dingo","dingo"); Collection<String> similar = new HashSet<String>( listOne ); Collection<String> different = new HashSet<String>(); different.addAll( listOne ); different.addAll( listTwo ); similar.retainAll( listTwo ); different.removeAll( similar ); System.out.printf("One:%s%nTwo:%s%nSimilar:%s%nDifferent:%s%n", listOne, listTwo, similar, different); } }
Выход:
Если он не делает именно то, что вам нужно, это дает вам хорошее начало, так что вы можете справиться с этим.
Вопрос к читателю: как бы вы включили все повторяющиеся значения?
источник
listOne
, но +1 все равно!Можно попробовать
intersection()
иsubtract()
методы изCollectionUtils
.intersection()
Метод дает вам коллекцию, содержащую общие элементы, аsubtract()
метод дает вам все необычные.Им также следует позаботиться об аналогичных элементах
источник
Действительно ли это списки (упорядоченные, с дубликатами) или наборы (неупорядоченные, без дубликатов)?
Потому что, если это последнее, то вы можете использовать, скажем, a
java.util.HashSet<E>
и сделать это за ожидаемое линейное время, используя удобныйretainAll
.List<String> list1 = Arrays.asList( "milan", "milan", "iga", "dingo", "milan" ); List<String> list2 = Arrays.asList( "hafil", "milan", "dingo", "meat" ); // intersection as set Set<String> intersect = new HashSet<String>(list1); intersect.retainAll(list2); System.out.println(intersect.size()); // prints "2" System.out.println(intersect); // prints "[milan, dingo]" // intersection/union as list List<String> intersectList = new ArrayList<String>(); intersectList.addAll(list1); intersectList.addAll(list2); intersectList.retainAll(intersect); System.out.println(intersectList); // prints "[milan, milan, dingo, milan, milan, dingo]" // original lists are structurally unmodified System.out.println(list1); // prints "[milan, milan, iga, dingo, milan]" System.out.println(list2); // prints "[hafil, milan, dingo, meat]"
источник
Использование java 8 removeIf
public int getSimilarItems(){ List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"); List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection int initial = two.size(); two.removeIf(one::contains); return initial - two.size(); }
источник
Если вы ищете удобный способ проверить равенство двух коллекций, вы можете использовать
org.apache.commons.collections.CollectionUtils.isEqualCollection
, который сравнивает две коллекции независимо от порядка.источник
Из всех подходов я считаю использование
org.apache.commons.collections.CollectionUtils#isEqualCollection
лучшим. Вот причины -Если это невозможно иметь
apache.commons.collections
в качестве зависимости, я бы рекомендовал реализовать алгоритм, которому он следует, чтобы проверить равенство списка из-за его эффективности.источник
Простое решение: -
List<String> list = new ArrayList<String>(Arrays.asList("a", "b", "d", "c")); List<String> list2 = new ArrayList<String>(Arrays.asList("b", "f", "c")); list.retainAll(list2); list2.removeAll(list); System.out.println("similiar " + list); System.out.println("different " + list2);
Выход :-
источник
Предполагая
hash1
иhash2
List< String > sames = whatever List< String > diffs = whatever int count = 0; for( String key : hash1.keySet() ) { if( hash2.containsKey( key ) ) { sames.add( key ); } else { diffs.add( key ); } } //sames.size() contains the number of similar elements.
источник
Я нашел очень простой пример сравнения списков в разделе « Сравнение списков». Этот пример сначала проверяет размер, а затем проверяет доступность конкретного элемента одного списка в другом.
источник
public static boolean compareList(List ls1, List ls2){ return ls1.containsAll(ls2) && ls1.size() == ls2.size() ? true :false; } public static void main(String[] args) { ArrayList<String> one = new ArrayList<String>(); one.add("one"); one.add("two"); one.add("six"); ArrayList<String> two = new ArrayList<String>(); two.add("one"); two.add("six"); two.add("two"); System.out.println("Output1 :: " + compareList(one, two)); two.add("ten"); System.out.println("Output2 :: " + compareList(one, two)); }
источник
? true :false
, необходима в вашем фрагменте?