Java сравнить два списка - PullRequest
84 голосов
/ 04 мая 2010

У меня есть два списка (не 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, если да, то каким способом получить мой результат?

Пожалуйста, помогите

П.С .: Это не школьное задание :) Так что, если вы просто проведете меня, этого будет достаточно

Ответы [ 9 ]

153 голосов
/ 04 мая 2010

EDIT

Вот две версии. Один использует ArrayList, а другой - HashSet

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

Этого должно быть достаточно, чтобы покрыть:

П.С.: Это не школьное задание :) Так что, если вы просто проведете меня, этого будет достаточно

часть вашего вопроса.

продолжение исходного ответа:

Для этого вы можете использовать java.util.Collection и / или java.util.ArrayList.

Метод 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 (разница в том, что Set не допускает повторных значений)

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]

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

Вопрос для читателя: Как бы вы включили все повторяющиеся значения?

32 голосов
/ 04 мая 2010

Вы можете попробовать методы intersection() и subtract() из CollectionUtils.

intersection() метод дает вам коллекцию, содержащую общие элементы, а метод subtract() дает вам все необычные.

Они должны также заботиться о подобных элементах

9 голосов
/ 04 мая 2010

Это действительно списки (упорядоченные, с дубликатами) или наборы (неупорядоченные, без дубликатов)?

Поскольку, если это последнее, то вы можете использовать, скажем, 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]"
4 голосов
/ 29 марта 2017

Использование 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();
}
2 голосов
/ 20 марта 2018

Если вы ищете удобный способ проверить равенство двух коллекций, вы можете использовать org.apache.commons.collections.CollectionUtils.isEqualCollection, который сравнивает две коллекции независимо от порядка.

1 голос
/ 02 августа 2018

Простое решение: -

    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]
1 голос
/ 07 декабря 2014

Я нашел очень простой пример сравнения списков в Сравнение списков В этом примере сначала проверяется размер, а затем проверяется доступность определенного элемента одного списка в другом.

1 голос
/ 04 мая 2010

Предполагая 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.
0 голосов
/ 21 июня 2017
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));
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...