Java 如何洗牌列表中的特定元素集?

Java 如何洗牌列表中的特定元素集?,java,algorithm,sorting,arraylist,shuffle,Java,Algorithm,Sorting,Arraylist,Shuffle,我已经创建了一个ArrayList。MyObject有一个属性优先级,并实现了我已经重写的comparable方法 我想: 根据优先级属性对ArrayList进行排序。我通过以下方式做到了这一点: Collections.sort(ArrayList<MyObjects>) myObject有一个compareTo方法,用于比较两个myObject的优先级 假设排序后,对象的顺序为: object7 object8 object4 object5 object1 // priori

我已经创建了一个ArrayList。MyObject有一个属性优先级,并实现了我已经重写的comparable方法

我想:

根据优先级属性对ArrayList进行排序。我通过以下方式做到了这一点:

Collections.sort(ArrayList<MyObjects>)
myObject有一个compareTo方法,用于比较两个myObject的优先级

假设排序后,对象的顺序为:

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.sortArrayList时,随机性就不成立了

我应该创建自己的排序算法吗

还是一个洗牌算法

或者已经有一种算法可以对列表中的一组特定元素进行无序排列吗?

在排序之前先对列表进行无序排列。Collections.sort保证是稳定的排序,因此相等的元素的顺序将与未排序的集合中的相同。。。您只需要确保该顺序是适当的随机顺序。最简单的方法是:

Collections.shuffle(objectList);
Collections.sort(objectList);

您可以将数据划分为一个树状图,该树状图将您的不同优先级映射到具有相同优先级的myObject的子列表中


有了这种数据结构,您可以按照自己的意愿洗牌这些子列表,并且迭代所有元素也是很简单的。TreeMap可以保持子列表的优先级顺序。

这可能是一个很好的解决方案,但这种解决方案固有地洗牌了许多实际上不需要的元素,即它们具有唯一的优先级。有什么解决办法吗?@Michael:我希望洗牌会开始,而试图找到所有具有同等优先级元素的组也会开始。。。所以基本上,我看不出有什么问题;其他解决方案最终也会有同样的复杂性。文档中确实说明了一个问题,即使这个解决方案在技术上是正确的,但它也存在一个问题,我认为这一问题非常重要,值得评论:业务需求已经被隐式地解决了,而不是显式地解决了。这意味着阅读/维护代码的人需要知道MyObject的自然排序顺序基于优先级,而b Collections.sort使用稳定的排序算法。除非您仔细记录此信息,否则当某人认为使用快速排序对列表进行排序是个好主意时,可能会引入错误。@Mick:我当然希望该类按照排序顺序进行记录。然后我会添加一条注释来解释shuffle的用法,它依赖于顺序的稳定性。我认为就涉及的代码而言,这是最简单的解决方案。
Collections.shuffle(objectList);
Collections.sort(objectList);