我创建了一个ArrayList<MyObjects>
。 MyObject
有一个属性priority
,并实现了我可以覆盖的可比方法。
我想:
根据ArrayList<MyObjects>
属性对priority
进行排序。我已经做到了:
Collections.sort(ArrayList<MyObjects>)
但是,在排序之后,我想随机洗牌(仅)具有相同priority
的元素,保持优先级的一般顺序。
ArrayList <myObject> objectList = new ArrayList <MyObject>();
objectList = {object1, object2, object3, object4,
object5, object6, object7, object8, object9}
Collections.sort(objectList)
myObject有一个compareTo()
方法,用于比较两个myObject的priority
。
说明在排序后,对象的顺序是:
object7
object8
object4
object5
object1 // priority = 2
object2 // priority = 2
object3 // priority = 2
object9
object8
object1
,object2
和object3
都具有相同的优先级。
如何在不影响其他物体的情况下将它们洗牌?
即,有一个清单:
object7
object8
object4
object5
objectx // priority = 2
objecty // priority = 2
objectz // priority = 2
// where {x, y, z} are randomly selected from {1, 2, 3}
object9
object8
我想在compareTo()
方法中进行随机赋值,当它具有相等性时。
@Override
public int compareTo(MyObject otherObject) {
int comparison;
if (this.priority < otherObject.priority) {comparison = +1;}
else if (this.priority > otherObject.priority) {comparison = -1;}
else {
Random generator = new Random();
comparison = generator.nextInt( 3 ) - 1;
}
return comparison;
但我想,当我打电话给Collections.sort(ArrayList<MyObjects>)
时,随机性将不会成立。
我应该创建自己的排序算法吗?
还是改组算法?
或者是否已存在一种混合列表中特定元素集的算法?
答案 0 :(得分:3)
在之前对列表进行排序。 Collections.sort
保证是一个稳定的排序,所以相同的元素将与它们在未排序的集合中的顺序相同......您只需要确保该顺序是一个适当的随机顺序。 Collections.shuffle
是最简单的方法:
Collections.shuffle(objectList);
Collections.sort(objectList);
答案 1 :(得分:1)
您可以将数据划分为TreeMap<Priority, List<MyObject>>
,这会将您的不同优先级映射到具有相同优先级的MyObject
子列表。
使用此数据结构,您可以根据需要随机播放这些子列表,并且迭代所有元素也很简单(TreeMap
按优先级顺序保留子列表。)