gpt4 book ai didi

java - 如何从 Java ArrayList 中删除重复的对象?

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:00 25 4
gpt4 key购买 nike

我需要您帮助提供一些示例代码,以应对我无法摆脱的情况。我有一个简单的对象列表。我的类(class)是这样的:

class MyClass {
String str;
Integer intgr;
}

该列表包含以下元素:

[{a1  5}, {b2  3}, {g1  1}, {b5  1}, {c9  11}, {g2  3}, {d1  4}, {b3  19}... ... ...]

我需要检查字符串中是否有任何元素包含相同的前缀(这里后缀是最后一个字符),然后保留整数值较大的元素。上述示例列表的预期输出将是:

[{a1  5}, {c9  11}, {g2  3}, {d1  4}, {b3  19}... ... ...]

字符串将具有唯一值,但可以在前缀中具有匹配项。我的java不太好。那么有人可以帮我解决这个问题吗?这是我正在尝试但收到 IndexOutOfBoundsException 的代码。此代码有错误,因此需要您的帮助。

谢谢!

        int size = list.size();
for (int j = 0; j < size; j++) {
if (list.get(j).str.substring(0, list.get(j).str.length()-1).compareTo(list.get(j+1).str.substring(0, list.get(j+1).str.length()-1)) == 0) {
if (list.get(j).intgr > list.get(j+1).intgr)
list.remove(list.get(j+1));
size--;
else {
list.remove(list.get(j));
j--;
size--;
}
}
}

最佳答案

您可以迭代元素集合,将它们添加到将键(前缀)与值(对象)相关联的 Map 中。每次添加元素时,您都会检查以相同前缀存储的元素是否大于添加的元素。

为了实现此行为:

provides this: [{a1 5}, {b2 3}, {g1 1}, {b5 1}, {c9 11}, {g2 3}, {d1 4}, {b3 19}]
results this: [{a1 5}, {c9 11}, {g2 3}, {d1 4}, {b3 19}]

你可以实现这样的东西:

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class TestSystemOut {

public static void main(final String[] a) {
List<MyObj> list = prepareList();
System.out.println("provides this: " + list);

Map<String, MyObj> map = new LinkedHashMap<String, MyObj>(); // if result order doesn't matter this can be a simple HashMap

String strTmp;
for (MyObj obj : list) {

strTmp = obj.str;
strTmp = strTmp.substring(0, strTmp.length() - 1);

if (map.get(strTmp) == null || map.get(strTmp).integer < obj.integer) {
map.remove(strTmp); // this could be removed if order of result doesn't matter
map.put(strTmp, obj);
}
}

list.clear();
list.addAll(map.values());

System.out.println("results this: " + list);
}

public static class MyObj {
String str;
Integer integer;

public MyObj(final String str, final Integer integer) {
super();
this.str = str;
this.integer = integer;
}

@Override
public String toString() {
return "{" + str + " " + integer + "}";
}

}

private static List<MyObj> prepareList() {
List<MyObj> list = new ArrayList<MyObj>();
list.add(new MyObj("a1", 5));
list.add(new MyObj("b2", 3));
list.add(new MyObj("g1", 1));
list.add(new MyObj("b5", 1));
list.add(new MyObj("c9", 11));
list.add(new MyObj("g2", 3));
list.add(new MyObj("d1", 4));
list.add(new MyObj("b3", 19));
return list;
}
}

关于java - 如何从 Java ArrayList 中删除重复的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11232857/

25 4 0