如何随机排列列表中的特定元素集?

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

object1object2object3 都具有相同的优先级。

我怎样才能在不影响其他对象的情况下打乱它们?

即有一个列表:

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 保持子列表的优先顺序)。