我想創建可能包含重複值的集合,順序不特定。什麼Java收集認爲排列是平等的?
換句話說:
{ 1, 1, 2 } == { 2, 1, 1 } == { 1, 2, 1 }
其實,我想有一組這些集合的,所以如果我嘗試添加這兩種{ 1, 1, 2 }
和{ 2, 1, 1 }
,第二.add()
實際上不會做任何事情。
是否有一個標準集合已經表現這種方式?
如果我理解正確:
- ArrayList中允許重複值,但有一個固定的順序
- 的HashSet允許以任意,但沒有重複的值
- TreeSet的保證訂單常量,但不允許有重複值
是否有一個我忽略的集合,允許重複值以及任意值或固定值爲了使兩個具有相同元素的集合被認爲是相等的?
@asteri問我的用例。在一場比賽中,我有不同長度的塊,可以首尾相連,填滿一定的距離。例如,如果距離爲10,則可以填充2-3-5或5-2-3或3-3-4或3-4-3,或其他任何數量的排列。根據可用的塊,我想列出所有可能的解決方案以填補空白。
定製的解決方案
@sprinter建議設立的ArrayList的子類。 @dasblinkenlight和@Dici建議使用Map來存儲{ Element : Count }
條目。我選擇結合這兩個建議。以下是TreeMap的一個子類。密鑰總是以相同的順序存儲,以確保hashCode()方法生成相同的值,例如使用相同的鍵和值。
我已經使用了一個increment
方法,以方便添加特定整數「值」的新發生。
package com.example.treematch;
import java.util.Map;
import java.util.TreeMap;
public class TreeMatch<K> extends TreeMap<K, Integer> {
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof TreeMatch)) {
return false;
}
TreeMatch otherMatch = (TreeMatch) other;
if (size() != otherMatch.size()) {
return false;
}
for (Object key : this.keySet()) {
if (!otherMatch.containsKey(key)) {
return false;
}
}
for (Object key : otherMatch.keySet()) {
if (!this.containsKey(key)) {
return false;
}
if (this.get(key) != otherMatch.get(key)) {
return false;
}
}
return true;
}
public void increment(K key) {
Integer value;
if (this.containsKey(key)) {
value = (this.get(key)) + 1;
} else {
value = 1;
}
this.put(key, value);
}
@Override
public int hashCode() {
int hashCode = 0;
for (Map.Entry entry : this.entrySet()) {
hashCode += entry.getKey().hashCode();
hashCode = hashCode << 1;
hashCode += entry.getValue().hashCode();
hashCode = hashCode << 1;
}
return hashCode;
}
}
嗯......有趣的問題。不是我能想到的,儘管在Apache Commons或Guava中可能會有所幫助。出於好奇,我可以問你的用例嗎? – asteri
不是您的問題的答案,但一個簡單的解決方法是將它們作爲列表,然後對它們進行排序並進行比較。 – asteri
有趣:有沒有辦法檢查兩個類別包含相同的元素,獨立的順序?](http://stackoverflow.com/a/1565262/1762224)' - >''HashMultiset.create(C1)。等於(HashMultiset.create(C2));' –