2016-08-09 26 views
-2

У меня есть список TreeSet<Rate>. Мне нужно пересечение всех TreeSets в списке. Я проверил reatainAll, он работает над двумя наборами. Исправьте меня, если я ошибаюсь. Максимальный размер списка - 8.Пересечение всех N наборов в Java

Как я могу получить пересечение всех этих множеств?

public class Rate implements Comparable<Rate> { 

private double value = 0.00; 
private int restuarentID = 0; 

//setters and getters 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + restuarentID; 
    long temp; 
    temp = Double.doubleToLongBits(value); 
    result = prime * result + (int) (temp^(temp >>> 32)); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Rate other = (Rate) obj; 
    if (restuarentID != other.restuarentID) 
     return false; 
    if (Double.doubleToLongBits(value) != Double.doubleToLongBits(other.value)) 
     return false; 
    return true; 
} 

@Override 
public int compareTo(Rate o) { 
    int ret = 0; 
    if (this.getValue() > o.getValue()) 
     ret = 1; 
    if (this.getValue() < o.getValue()) 
     ret = -1; 
    if (this.getValue() == o.getValue()) 
     ret = 0; 
    return ret; 
} 

}

+1

Используйте 'retainAll' на всех наборах, 2 в то время. – Kayaman

+1

Несмотря на использование 'TreeSet', вы должны реализовать' equals() 'и' hashCode() 'в вашей' Rate', если вы используете его в коллекциях. – RealSkeptic

+0

Вам нужно реализовать 'compareTo (Rate)' для компиляции вашего кода; и, как указано в предыдущем комментарии, вы, вероятно, также захотите переопределить 'equals (Object)'. –

ответ

2

Вы можете сделать так:

public static TreeSet<Rate> intersect(List<TreeSet<Rate>> setList) { 
    if (setList.isEmpty()) { 
     throw new IllegalArgumentException("Need at least one TreeSet in list"); 
    } 
    Iterator<TreeSet<Rate>> it = setList.iterator(); 
    TreeSet<Rate> result = new TreeSet<>(it.next()); 
    while (it.hasNext()) { 
     result.retainAll(it.next()); 
    } 
    return result; 
}