我有一个列表,其中包含的变量包含的变量可能是 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 */
}
我怎样才能轻松做到这一点?
希望这能解释我想要做的事情。如果不是,我非常愿意澄清:)
答案 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);
}