我意识到这个问题以前可能被问过很多次,但对于这个特定的应用程序,使用循环并不能真正起作用,因为我无法索引到一个集合
我想做的是尽可能有效地从哈希集中的数据中获得一组可能的无序对。
因此,如果我的哈希集包含A、B、C、D、E则可能出现以下组合:AB、AC、AD、AE、BC、BD、BE、CD、CE、DE
我有什么选择可以有效地实现这一点?
任何想法都将不胜感激
就效率而言,没有太多选择:您需要生成一组N2项,这意味着时间也至少是相同的顺序。
由于枚举一个集合是线性的,所以两个嵌套循环将像任何其他方法一样有效地处理这个问题。
外部的循环应该从一开始就迭代集合。内部的循环应该从外部循环的迭代器的位置开始,增加一个位置。
您仍然可以index
您的数据,只需添加一个额外的HashMap<Your_Class, Integer> map
来存储特定数据的索引。
HashSet<Your_Class> set = ...//HashSet that contains data
int index = 0;
HashMap<Your_Class,Integer> map = new HashMap<>();
for(Your_Class item : set){
map.put(item, index++);
}
//Generate all the set with those indexes, and replace them with map.get(index)
因此,在示例情况下,A具有索引0,B具有索引1,。。。。,因此,对于每对01、02、03…,只需要将其转换回AB、AC,。。。
没有太多的选项。您可以将您的对象排列在一个可移动对象类中,其中有两个对象,如下所示:
public T Class Arrangement<T>{
private final T object1;
private final T object2;
public Arrangement(T object1, T)
// get methods...
}
Set<MyType> mySet = new HashSet<MyType>();
mySet.add(new Arrangement(myObject1, myObject2);
像这样的东西!