按对象的属性或方法*对arraylist进行排序,但按不同的排序顺序= ABC,BCA,CAB等

时间:2017-10-08 14:52:12

标签: java sorting arraylist

我有一个列表,其中包含的变量包含的变量可能是 3个不同值中的1个。 我希望能够根据给定的值对列表进行排序,以便列表最终为:[b,b,b, c,c,c, a,a,a]或我选择的任何模式。 (其中b,c或a是MyItem的 itemType 的表示,请参阅下面的代码。)

排序后的列表最终会被排序为[MyItem,MyItem,MyItem ...等等],这样排序是因为带有itemType = b的MyItem是第一个,然后是类型c第二个,然后是类型a第三个。< / p>

也许更好的方式来描述我想要的是分组或分组?

public class MyItem {
    // possible values for item type
    public static final int ITEM_TYPE_A = 0x0;
    public static final int ITEM_TYPE_B = 0x1;
    public static final int ITEM_TYPE_C = 0x2;

    protected int itemType; 
}

public class ArrayThing {
    ArrayList<MyItem> list;

    public void sortBy(int sortOrder) {
        /* sort items in list by sortOrder takes a 3 digit int     
           representing the order examples: 123 = ABC, 321 = CBA
        */ 
        switch(sortOrder) {
            case(123): do sort stuff here // sort by order ABC
            case(132): do sort stuff here // sort by order ACB
            case(231): do sort stuff here // sort by order BCA
            /* and so on */
}

我怎样才能轻松做到这一点?

希望这能解释我想要做的事情。如果不是,我非常愿意澄清:)

2 个答案:

答案 0 :(得分:1)

您需要实现自定义排序比较功能,以实现您的目标。

class SortItem implements Comparator<MyItem>
{
    public int compare(MyItem a, MyItem b)
    {
          // your logic to sort the items based on a.itemType and b.itemType
          // return int negative value will push item b before a and value 0 and above leaves both the item unchanged.
    }
}

然后你可以像

那样对你的数组进行排序
ArrayThing arr = [.......]; // your ArrayThing Object
Arrays.sort(arr, new SortItem());

现在你应该根据自定义标准进行排序。希望这会有所帮助。

答案 1 :(得分:1)

通过利用只有3个可能项目的事实,这可以比使用Comparator更有效地完成。在我看来,编程也稍微容易一些。这是一个如何编写它(未经测试)的示例。

public void sortBy(int sortOrder) {
    // Step 1: Divide the items into 3 groups
    List<List<MyItem>> groups = Arrays.asList(new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
    for (MyItem item : list)
        groups.get(item.itemType).add(item);

    // Step 2: Use a string to represent the order (ugly, but works)
    String order = String.valueOf(sortOrder);

    // Step 3: Put the three groups back into the list in the correct order.
    int index = 0;
    for (char c : order.toCharArray())
        for (MyItem item : groups.get(c - '1'))
            list.set(index++, item);
}