Способ проверить, содержат ли две коллекции одни и те же элементы, независимо от порядка?

Скажем, у меня есть два разных хэшета, как показано ниже, как я могу проверить, что два Hashset содержат одни и те же элементы, и эти два хэш-набора равны, независимо от порядка элементов в коллекции, пожалуйста, сообщите..!!

Set set1=new HashSet();
          set.add(new Emp("Ram","Trainer",34000));
          set.add(new Emp("LalRam","Trainer",34000));

а другой -..

Set set2=new HashSet();
          set.add(new Emp("LalRam","Trainer",34000));
          set.add(new Emp("Ram","Trainer",34000));

Сотрудник pojo...

class Emp //implements Comparable
{
      String name,job;
      public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }
    int salary;
      public Emp(String n,String j,int sal)
      {
         name=n;
         job=j;
         salary=sal;
       }
      public void display()
      {
        System.out.println(name+"\t"+job+"\t"+salary);
       }



  public boolean equals(Object o)
      {

         Emp p=(Emp)o;
          return this.name.equals(p.name)&&this.job.equals(p.job) &&this.salary==p.salary;
       }
   public int hashCode()
       {
          return name.hashCode()+job.hashCode()+salary;
       }


      /* public int compareTo(Object o)
       {
          Emp e=(Emp)o;
          return this.name.compareTo(e.name);
           //return this.job.compareTo(e.job);
        //   return this.salary-e.salary;

        }*/
} 

Ответ 1

Если вам по какой-то причине не понадобится реализовать свой метод, просто используйте h1.equals(h2). Возможная реализация описана ниже.

  • Проверьте, что # элементов одинаково. Если нет, верните false.
  • Набор клонов 2 (если вам нужно сохранить 2 после)
  • Итерации через набор 1, проверьте, найден ли каждый элемент в наборе клонов 2. Если найдено, удалите из набора 2. Если не найдено, верните false.
  • Если вы дойдете до конца итераций и сопоставили каждый элемент набора 1, наборы равны (поскольку вы уже сравнили размеры двух наборов).

Пример:

public boolean isIdenticalHashSet <A> (HashSet h1, HashSet h2) {
    if ( h1.size() != h2.size() ) {
        return false;
    }
    HashSet<A> clone = new HashSet<A>(h2); // just use h2 if you don't need to save the original h2
    Iterator it = h1.iterator();
    while (it.hasNext() ){
        A = it.next();
        if (clone.contains(A)){ // replace clone with h2 if not concerned with saving data from h2
            clone.remove(A);
        } else {
            return false;
        }
    }
    return true; // will only return true if sets are equal
}

Ответ 2

Цитата из AbstractSet.equals(Object) javadoc:

Возвращает true, если данный объект также является множеством, два набора имеют одинакового размера, и каждый член данного набора содержится в этом наборе. Это гарантирует, что метод equals работает правильно по разным реализации интерфейса Set.

Поэтому достаточно просто называть set1.equals(set2). Он вернет true тогда и только тогда, когда в наборе содержатся одни и те же элементы (предполагается, что вы правильно определили equals и hashCode для объектов в наборах).

Ответ 3

Используйте приведенное ниже выражение.

set1.containsAll(set2) && set2.containsAll(set1)

Ответ 4

Предполагая, что вы определили equals и hashcode, здесь один из способов. Не очень эффективен для крупных участников.

  • Проверьте количество элементов в каждом. Если они не равны, вы выполняете [не равно].
  • Петля через Set1. Проверьте, содержит ли Set2 каждый элемент, если вы не выполнили [не равно]. иначе, если вы пройдете весь набор, вы равны

UPDATE: я не знал о containsAll, что экономит массу проблем и в основном делает этот алгоритм

int s1 = set1.size();
int s2 = set2.size();
if (s1 !=s2) return false;
return set1.containsAll(set2);

Ответ 5

Если вам нужно равенство данных, тогда правильно реализуйте equals() и hashCode(), а затем вы можете использовать Collection.containsAll(...), Конечно, вам нужно убедиться, что вы вызываете это только тогда, когда обе ваши коллекции имеют одинаковое количество элементов, иначе вы можете просто сказать, что они не равны.

Ответ 6

делать:

  setResult = set2.clone();

  if ( setResult.retainAll( set1 ) ){

   //do something with results, since the collection had differences

}

Ответ 7

1 - Получить коллекцию (пусть она будет называться "различия"), которая будет содержать элементы, которые есть в одной коллекции, а в другой нет -

Отличия коллекции = CollectionUtils.subtract(Collection1, Collection2);

2 - Проверьте, что размер == 0;

Если так - обе коллекции имеют одинаковые элементы; если нет - есть некоторые различия, а затем вы должны распечатать все элементы, которые имеют "различия".

Не уверен, если это зависит от заказа товаров. Я сравниваю коллекции таким образом

Ответ 8

Подробное, но (надеюсь) эффективное решение, когда вы не знаете типы коллекций:

public static <T> boolean equalIgnoreOrder(Collection<T> c1, Collection<T> c2) {
    int size1 = c1.size();  // O(1) for most implementations, but we cache for the exceptions.
    if (size1 != c2.size()) {
        return false;
    }
    Set<T> set;
    Collection<T> other;
    if (c1 instanceof Set) {
        set = (Set<T>) c1;
        other = c2;
    } else if (c2 instanceof Set) {
        set = (Set<T>) c2;
        other = c1;
    } else if (size1 < 12 ) { // N^2 operation OK for small N
        return c1.containsAll(c2);
    } else {
        set = new HashSet<>(c1);
        other = c2;
    }
    return set.containsAll(other);  // O(N) for sets
}