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.: Это не школьное присвоение :) Таким образом, если Вы просто будете вести меня, то это будет достаточно

85
задан user238384 3 May 2010 в 13:53
поделиться

4 ответа

РЕДАКТИРОВАТЬ

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

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

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

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

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

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

Для этого вы можете использовать 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 );
    }
}

EDIT

Для второго part (аналогичные значения), вы можете использовать метод removeAll :

Удаляет все элементы этой коллекции, которые также содержатся в указанной коллекции.

Эта вторая версия дает вам также аналогичные значения и повторяющиеся дескрипторы (отбрасывая их).

На этот раз набор может быть набором вместо списка (разница в том, что набор не позволяет повторять значения)

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]

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

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

154
ответ дан 5 November 2019 в 05:56
поделиться

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

Потому что, если последнее, то вы можете использовать, скажем, java.util.HashSet и сделать это в ожидаемое линейное время с помощью удобного keepAll .

    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]"
9
ответ дан 5 November 2019 в 05:56
поделиться

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

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

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

34
ответ дан 5 November 2019 в 05:56
поделиться

Предполагая 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.
1
ответ дан 5 November 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: