Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从哈希集生成可能的无序组合对_Java_Combinations - Fatal编程技术网

Java 从哈希集生成可能的无序组合对

Java 从哈希集生成可能的无序组合对,java,combinations,Java,Combinations,我意识到这个问题以前可能被问过很多次, 但是对于这个特殊的应用程序,使用循环并不能真正起作用,因为我不能索引到一个集合中 我想做的是尽可能高效地从散列集中的数据中获取一组可能的无序对 如果我的哈希集包含A,B,C,D,E 然后可能出现以下组合:AB、AC、AD、AE、BC、BD、BE、CD、CE、DE 我有哪些选择可以有效地实现这一目标 任何想法都将受到极大的赞赏就效率而言,没有太多的选择:您需要生成一组N2项,这意味着时间安排也至少是相同的顺序 因为枚举一个集合是线性的,所以两个嵌套循环将像其

我意识到这个问题以前可能被问过很多次, 但是对于这个特殊的应用程序,使用循环并不能真正起作用,因为我不能索引到一个集合中

我想做的是尽可能高效地从散列集中的数据中获取一组可能的无序对

如果我的哈希集包含A,B,C,D,E 然后可能出现以下组合:AB、AC、AD、AE、BC、BD、BE、CD、CE、DE

我有哪些选择可以有效地实现这一目标


任何想法都将受到极大的赞赏

就效率而言,没有太多的选择:您需要生成一组N2项,这意味着时间安排也至少是相同的顺序

因为枚举一个集合是线性的,所以两个嵌套循环将像其他方法一样有效地处理这个问题


外部的循环应该从一开始就迭代集合。内部循环应该从外部循环迭代器的位置开始,递增一个位置。

您仍然可以
索引数据,只需添加一个额外的
HashMap映射
来存储特定数据的索引

 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)
HashSet=…//包含数据的HashSet
int指数=0;
HashMap=newHashMap();
用于(您的课程项目:设置){
map.put(item,index++);
}
//使用这些索引生成所有集合,并用map.get(index)替换它们

因此,在示例中,A有索引0,B有索引1,…,因此对于每对01、02、03,…,只需将其转换回AB、AC,…

没有太多选项。您可以使用以下两个对象将对象排列在imutable对象类中:

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);
公共T类课程安排{
私人终审法院反对1;
私人最终反对意见2;
公共安排(T对象1,T)
//获取方法。。。
}
Set mySet=newhashset();
添加(新排列(myObject1,myObject2);

类似这样的事情!

事实上很抱歉,我只是真的很抱歉,这是一组数据而不是哈希集-这会改变什么吗?@user3601148它不会改变任何东西,但您需要为
提供
等于
hashCode
方法,以确保每个被索引的数据都是唯一的(这意味着如果您的数据中有两个实例
A
,它将只有一个索引,而不是两个)。您可以看看,在这种情况下,将集合转换为数组是更好的选择吗?@user3601148不太明白:),但是如果您想使用数组来索引数据,那么当您需要它的索引时,您需要使用for循环来查找特定的数据,因此时间复杂度可能会稍差一些