Java Сравнивает Два Списка
У меня есть два списка (не списки 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, если да, то какой метод получить мой результат?
пожалуйста, помогите
P. S: это не школьное задание :) так что если вы просто направите меня, это будет хватит
9 ответов:
EDIT
вот две версии. С помощью
ArrayList
и другие с помощьюHashSet
сравните их и создайте свой собственные версия от этого, пока вы не получите то, что вам нужно.
этого должно быть достаточно для покрытия:
P. S: это не школьное задание :) так что если вы просто направите меня, этого будет достаточно
часть вашей вопрос.
продолжая с оригинальным ответом:
можно использовать
java.util.Collection
и/илиjava.util.ArrayList
для этого.The retainAll метод делает следующее:
сохраняет только элементы в этой коллекции, которые содержатся в указанной коллекции
посмотреть этот пример:
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 ); } }
EDIT
для во второй части (аналогичные значения) вы можете использовать removeAll способ:
удаляет все элементы этой коллекции, которые также содержатся в указанной коллекции.
эта вторая версия дает вам также аналогичные значения и обрабатывает повторные (отбрасывая их).
в этот раз
Collection
может быть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); } }
выход:
$ java Repeated One:[milan, iga, dingo, iga, elpha, iga, hafil, iga, meat, iga, neeta.peeta, iga] Two:[hafil, iga, binga, mike, dingo, dingo, dingo] Similar:[dingo, iga, hafil] Different:[mike, binga, milan, meat, elpha, neeta.peeta]
если он не делает именно то, что вам нужно, это дает вам хороший старт, так что вы можете справиться отсюда.
вопрос для читателя: как бы вы включили все повторяющиеся значения?
вы можете попробовать
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(); }
предполагая, что
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.
Я нашел очень простой пример сравнения списка Список Сравнения В этом примере сначала проверяется размер, а затем доступность конкретного элемента одного списка в другом.
Если вы ищете удобный способ проверить равенство двух коллекций, Вы можете использовать
org.apache.commons.collections.CollectionUtils.isEqualCollection
, который сравнивает две коллекции, независимо от заказа.
простое решение :-
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);
выход :-
similiar [b, c] different [f]
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)); }