我有一个对象列表,我需要根据一个名为ACTION的字段对其进行排序和分组。
public class MyClass {
private String account;
private String action;
// other fields
}
操作可以有3种类型DELETE, UPDATE和ADD。
预期的列表应该有所有的对象按顺序,其中所有具有DELETE操作类型的对象应该首先在列表中,然后是操作类型UPDATE,然后是ADD。
请建议。
你的问题不清楚!然而,根据你最近的评论,我认为你可以这样做:
sortBase
是根据您的需要排序的列表。然后你可以用动作值对对象进行分组,并根据sortBase
List<String> sortBase = Arrays.asList("DELETE", "UPDATE", "ADD");
Map<String,List<MyClass>> map = list.stream()
.collect(Collectors.groupingBy(MyClass::getAction,
()->new TreeMap<>(Comparator.comparingInt(sortBase::indexOf)),
Collectors.toList()));
结果:
{删除=[…),更新=[…),添加=[…]}
public static List<MyClass> sortByAction(List<MyClass> items, String... actions) {
List<String> sortedActions = Arrays.stream(actions).map(String::toLowerCase).collect(Collectors.toList());
Function<MyClass, Integer> actionIndex = item -> sortedActions.indexOf(item.action.toLowerCase());
return items.stream().sorted(Comparator.comparingInt(actionIndex::apply)).collect(Collectors.toList());
}
public static class MyClass {
private final String account;
private final String action;
public MyClass(String account, String action) {
this.account = account;
this.action = action;
}
@Override
public String toString() {
return account + '-' + action;
}
}
List<MyClass> items = Arrays.asList(
new MyClass("one", "ADD"), new MyClass("two", "UPDATE"), new MyClass("three", "DELETE"),
new MyClass("four", "UPDATE"), new MyClass("five", "DELETE"), new MyClass("six", "ADD"));
List<MyClass> sortedItems = sortByAction(items, "DELETE", "UPDATE", "ADD");
System.out.println(items); // [one-ADD, two-UPDATE, three-DELETE, four-UPDATE, five-DELETE, six-ADD]
System.out.println(sortedItems); // [three-DELETE, five-DELETE, two-UPDATE, four-UPDATE, one-ADD, six-ADD]
注:作为一种替代方法,您可以使用Map
来收集一组项目
public static List<MyClass> sortByAction(List<MyClass> items, String... actions) {
Map<String, List<MyClass>> map = new HashMap<>();
for (MyClass item : items)
map.computeIfAbsent(item.action.toLowerCase(), action -> new ArrayList<>()).add(item);
List<MyClass> sorted = new ArrayList<>(items.size());
for (String action : actions)
if (map.containsKey(action.toLowerCase()))
sorted.addAll(map.get(action.toLowerCase()));
return sorted;
}
我不太懂Java,但如果这是一个Javascript问题,我会循环遍历数组
var delateArr = [];
var updateArr = [];
var addArr = [];
for(var i = 0; i < objectArray.length; i ++) {
if(obj.action == DELETE) {
deleteArr.push(obj); // add obj to sub list with only DELETE
objectArray.splice(i, 1); // remove obj from main list
}
// repeat for UPDATE and ADD
}
那么你应该有三个数组,其中只包含所需类型的对象,并且可以按你想要的顺序排列它们。
你可以这样做。
首先你可以为
创建一个Enumenum Action {
DELETE(1),
UPDATE(2),
ADD(3);
private Integer priority;
Action(Integer priority) {
this.priority = priority;
}
public Integer getPriority() {
return priority;
}
}
你可以在你的MyClass中实现Comparable接口。在这里你可以看到我已经比较了Actions的优先级值。
class MyClass implements Comparable<MyClass>{
private String account;
private Action action;
@Override
public int compareTo(MyClass o) {
return this.action.getPriority().compareTo(o.action.getPriority());
}
// getters and setters
}
你可以按照
排序list.stream().sorted(Comparable::compareTo).collect(Collectors.toList());