如何从ArrayList中去除Result对象重复项并保留最高grade项
如何从ArrayList中保留每个name对应grade最高的对象
原代码的问题
newList.contains(element.name)逻辑完全错误:newList存储的是Result对象,而非字符串类型的name,contains方法默认用对象引用相等判断,导致所有元素都会被加入列表,根本没实现去重逻辑。Result构造函数存在笔误:this.name=first;应改为this.name=name;,否则name属性无法被正确赋值。grade属性定义不合理:你需要比较grade的高低,但原代码中grade是String类型,无法直接做数值比较,必须改为int或其他数值类型。
方案一:利用已排序数据集的特性
从你的输入数据来看,数据集已经按name分组,同name下grade从高到低排序,这种情况下可以直接遍历,仅保留每个name分组的第一个元素(即grade最高的元素):
// 先修正Result类的定义 class Result { int date; String name; int grade; Result(int date, String name, int grade) { this.date = date; this.name = name; // 修正笔误 this.grade = grade; } } // 处理逻辑 List<Result> info = ...; // 你的已排序数据集 List<Result> newList = new ArrayList<>(); if (info.isEmpty()) { return; } // 初始化第一个元素 Result prev = info.get(0); newList.add(prev); for (int i = 1; i < info.size(); i++) { Result current = info.get(i); // 当前元素name与前一个不同,说明是新分组,加入结果列表 if (!current.name.equals(prev.name)) { newList.add(current); prev = current; } // 同name的元素因已按grade降序排列,直接跳过 } // 输出结果 for (Result st : newList) { System.out.println(st.date + " " + st.name + " " + st.grade); }
方案二:用HashMap实现通用去重(不依赖排序)
如果数据集没有按grade排序,或者需要更通用的实现,可以用HashMap存储每个name对应的最高grade对象:
List<Result> info = ...; // 用LinkedHashMap可保留原数据中首次出现最高grade元素的顺序 Map<String, Result> nameToTopResult = new LinkedHashMap<>(); for (Result element : info) { Result existing = nameToTopResult.get(element.name); if (existing == null) { // 该name无记录,直接存入 nameToTopResult.put(element.name, element); } else { // 比较grade,保留更高的那个 if (element.grade > existing.grade) { nameToTopResult.put(element.name, element); } } } // 转换为结果列表 List<Result> newList = new ArrayList<>(nameToTopResult.values()); // 输出结果 for (Result st : newList) { System.out.println(st.date + " " + st.name + " " + st.grade); }
内容的提问来源于stack exchange,提问作者zara
相关产品推荐
相关产品推荐

