如何在ArrayList按名称排序后筛选含1、2、3顺序的名称?
实现方法
核心思路
- 先将排序后的列表按
name分组,收集每个name对应的所有数字序列(如果每个Class1本身就带数字列表,可跳过分组步骤)。 - 编写工具方法检查数字序列中是否存在1→2→3的顺序子序列(不需要连续,只要先后顺序满足即可)。
- 遍历分组结果,对符合条件的
name输出指定格式的提示。
代码实现
1. 假设Class1的定义
class Class1 { private String name; private int num; // 构造器 public Class1(String name, int num) { this.name = name; this.num = num; } // Getter方法 public String getName() { return name; } public int getNum() { return num; } }
2. 检查1→2→3子序列的工具方法
private static boolean has123Sequence(List<Integer> nums) { int matchStage = 0; for (int num : nums) { if (matchStage == 0 && num == 1) { matchStage = 1; // 找到第一个目标1 } else if (matchStage == 1 && num == 2) { matchStage = 2; // 在1之后找到2 } else if (matchStage == 2 && num == 3) { return true; // 在2之后找到3,满足顺序 } } return false; }
3. 主逻辑处理
public static void main(String[] args) { // 示例:已按name排序的ArrayList<Class1> ArrayList<Class1> sortedList = new ArrayList<>(); sortedList.add(new Class1("name1", 1)); sortedList.add(new Class1("name1", 3)); sortedList.add(new Class1("name1", 2)); sortedList.add(new Class1("name1", 3)); sortedList.add(new Class1("name2", 2)); sortedList.add(new Class1("name2", 1)); sortedList.add(new Class1("name3", 1)); sortedList.add(new Class1("name3", 2)); sortedList.add(new Class1("name3", 3)); // 按name分组,保留原排序的name顺序 Map<String, List<Integer>> nameToNums = new LinkedHashMap<>(); for (Class1 item : sortedList) { nameToNums.computeIfAbsent(item.getName(), k -> new ArrayList<>()).add(item.getNum()); } // 遍历检查并输出结果 for (Map.Entry<String, List<Integer>> entry : nameToNums.entrySet()) { String name = entry.getKey(); if (has123Sequence(entry.getValue())) { System.out.printf("%s存在1、2、3顺序,存在问题%n", name); } } }
说明
- 因为原列表已按
name排序,使用LinkedHashMap分组可以保留name的出现顺序,和原列表一致。 - 工具方法采用线性遍历,一旦找到符合顺序的子序列就立即返回,效率较高。
- 如果你的
Class1中数字属性本身就是一个列表(而非单个数字),直接遍历sortedList,对每个元素的数字列表调用has123Sequence方法即可,无需分组。
内容的提问来源于stack exchange,提问作者NewBond007
相关产品推荐
相关产品推荐

