Java中无重复项和随机顺序的集合
看起来我既不能使用ArrayList也不能使用Set:Java中无重复项和随机顺序的集合,java,list,set,duplicates,shuffle,Java,List,Set,Duplicates,Shuffle,看起来我既不能使用ArrayList也不能使用Set: Set-我可以使用Set避免重复,但没有shuffle选项/集合。shuffle(列表) ArrayList-我可以使用shuffle随机排列列表,但允许重复 我可以使用Set并将其转换为ArrayList(或者反过来),以避免重复。或者,在集合中循环以随机化项目。但我正在寻找更有效的方法。据我所知,集合是不有序的,所以显然不能对集合中的项目进行洗牌。要从列表中删除重复项,我发现如下:。您可以维护两个单独的集合,一个ArrayList和
-我可以使用Set避免重复,但没有shuffle选项/Set
集合。shuffle(列表)
-我可以使用shuffle随机排列列表,但允许重复ArrayList
我可以使用
Set
并将其转换为ArrayList
(或者反过来),以避免重复。或者,在集合中循环以随机化项目。但我正在寻找更有效的方法。据我所知,集合是不有序的,所以显然不能对集合中的项目进行洗牌。要从列表中删除重复项,我发现如下:。您可以维护两个单独的集合,一个ArrayList
和一个HashSet
,并拒绝插入HashSet
中存在的任何项
如果您关心封装,请将这两个集合包装在一个实现List
的元对象中,并仔细记录重复元素的插入将被拒绝,即使List
的通用合同没有规定
谈到此解决方案的成本,我认为,与普通的
ArrayList
相比,从时间角度来看,成本是完全可以忽略的:对HashSet
s的大多数操作的成本分摊为O(1),即查找和插入。另一方面,您的内存使用率将是原来的两倍(或更多,具体取决于HashSet
加载因子)。使用最少的代码和最优雅的方式,您可以执行以下操作:
public void testFoo() {
Set<Integer> s = new TreeSet<Integer>();
s.add(2);
s.add(1);
s.add(3);
Collections.shuffle(Arrays.asList(s.toArray()));
}
public void testFoo(){
Set s=新树集();
s、 增加(2);
s、 增加(1);
s、 增加(3);
Collections.shuffle(Arrays.asList(s.toArray());
}
但这不是很有效,您可以使用数组和哈希函数将元素放置在数组中所需的位置,并在放置它们之前检查它们是否已经存在,这将在O(n)时间内工作,因此非常好,但需要更多的代码和对哈希函数的一些注意。- 可以使用映射避免重复,然后使用Map.entrySet()和无序排列ArrayList
集实现上使用Collections.shuffle()
的情况下实现这一点可能很棘手。