如何随机排列列表中的特定元素集?
How to shuffle specific set of elements in a list?
我创建了一个 ArrayList<MyObjects>
。 MyObject
具有属性 priority
,并实现了我已覆盖的可比方法。
我想:
根据 priority
属性对 ArrayList<MyObjects>
进行排序。我已经做到了:
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>)
时,随机性将不成立。
我应该创建自己的排序算法吗?
还是洗牌算法?
或者是否已经存在一种算法可以随机排列列表中的一组特定元素?
在排序之前打乱列表。 Collections.sort
保证是一个稳定的排序,所以相等的元素将与它们在未排序的集合中的顺序相同......你只需要确保该顺序是一个适当的随机顺序。 Collections.shuffle
是最简单的方法:
Collections.shuffle(objectList);
Collections.sort(objectList);
您可以将数据划分为 TreeMap<Priority, List<MyObject>>
,这会将您的不同优先级映射到具有相同优先级的 MyObject
的子列表中。
使用此数据结构,您可以随意排列这些子列表,并且遍历所有元素也很简单(TreeMap
保持子列表的优先顺序)。
我创建了一个 ArrayList<MyObjects>
。 MyObject
具有属性 priority
,并实现了我已覆盖的可比方法。
我想:
根据 priority
属性对 ArrayList<MyObjects>
进行排序。我已经做到了:
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>)
时,随机性将不成立。
我应该创建自己的排序算法吗?
还是洗牌算法?
或者是否已经存在一种算法可以随机排列列表中的一组特定元素?
在排序之前打乱列表。 Collections.sort
保证是一个稳定的排序,所以相等的元素将与它们在未排序的集合中的顺序相同......你只需要确保该顺序是一个适当的随机顺序。 Collections.shuffle
是最简单的方法:
Collections.shuffle(objectList);
Collections.sort(objectList);
您可以将数据划分为 TreeMap<Priority, List<MyObject>>
,这会将您的不同优先级映射到具有相同优先级的 MyObject
的子列表中。
使用此数据结构,您可以随意排列这些子列表,并且遍历所有元素也很简单(TreeMap
保持子列表的优先顺序)。