在字段上自定义排序和分组java对象(不是按字母顺序)



我有一个对象列表,我需要根据一个名为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
}

那么你应该有三个数组,其中只包含所需类型的对象,并且可以按你想要的顺序排列它们。

你可以这样做。

首先你可以为

创建一个Enum
enum 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());

最新更新