如何在列表中混洗特定的元素集?

时间:2016-06-04 19:36:27

标签: java algorithm sorting arraylist shuffle

我创建了一个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

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>)时,随机性将不会成立。

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

还是改组算法?

或者是否已存在一种混合列表中特定元素集的算法?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

您可以将数据划分为TreeMap<Priority, List<MyObject>>,这会将您的不同优先级映射到具有相同优先级的MyObject子列表。

使用此数据结构,您可以根据需要随机播放这些子列表,并且迭代所有元素也很简单(TreeMap按优先级顺序保留子列表。)