如何检查java中的LinkedList中是否存在对象?
How to check if an object exists in a LinkedList in java?
一个LinkedList包含一组Integer[]
。列表中的每个 Integer[]
都有 2 个数字。
链表示例:
Integer[]{1,2}, Integer[]{2,3}.....
在向这个 LinkedList
添加另一个 Integer[]
之前,我想检查是否已经存在具有相同数据的另一个 Integer[]
。
例如:要添加的对象 = Integer[] {2,3}
。但这已经存在于 LinkedList 中。
所以我想避免添加这个。
如何验证对象已经存在?是否有可以使用的内置功能? contains()
没成功。
好吧,你可以用愚蠢的方式来做:
boolean exists = false;
for (Integer[] integers : list) { // list being the LinkedList
if (Arrays.equals(integers, value)) {
exists = true;
break;
}
}
if (!exists) {
list.add(value);
}
我认为如果要处理坐标,最好使用特定的 class,因为 Integer[]
仅对两个数字无用,并且会导致 contains()
和其他一些问题List
方法也像 .sort()
。
您最好创建一个 Coordinate
class,它将包含两个值:
public class Coordinate{
private int x;
private int y;
//getters and setters, constructor
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Coord)) {
return false;
}
Coordinate coord = (Coordinate) o;
return coord.x == x &&
coord.y == y;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + x;
result = 31 * result + y;
return result;
}
}
那么你可以使用:
LinkedList<Coordinate>
注:
请注意,这里使用 Set
实现会更好,它会防止坐标集中出现重复,因此我们不需要手动检查。
您可以使用 Stream
和 Set
来解决您的问题,如下所示:
List<Set<Integer>> list = new LinkedList<>();
list.add(Stream.of(1, 2).collect(Collectors.toSet()));
Set<Integer> s1 = new HashSet<>();
s1.add(1);
s1.add(2);
System.out.println(list.contains(s1));
Set<Integer> s2 = new HashSet<>();
s2.add(1);
s2.add(4);
System.out.println(list.contains(s2));
O/P:
正确
错误
N.B: 您可以使用 ArrayList
因为您也保留了序列。
如果你真的很想用 contains()
来做(或者出于任何原因别无选择),你可以这样实现:
final Integer[] newPair = {2, 3};
final boolean exists = values.contains(new Object()
{
// note that List.contains() javadoc explicitly specifies that
// newPair is used as the receiver not the argument for equals()
@Override
public final boolean equals(final Object listElement)
{
final Integer[] otherPair = (Integer[]) listElement;
return Arrays.equals(newPair, otherPair);
}
});
一个LinkedList包含一组Integer[]
。列表中的每个 Integer[]
都有 2 个数字。
链表示例:
Integer[]{1,2}, Integer[]{2,3}.....
在向这个 LinkedList
添加另一个 Integer[]
之前,我想检查是否已经存在具有相同数据的另一个 Integer[]
。
例如:要添加的对象 = Integer[] {2,3}
。但这已经存在于 LinkedList 中。
所以我想避免添加这个。
如何验证对象已经存在?是否有可以使用的内置功能? contains()
没成功。
好吧,你可以用愚蠢的方式来做:
boolean exists = false;
for (Integer[] integers : list) { // list being the LinkedList
if (Arrays.equals(integers, value)) {
exists = true;
break;
}
}
if (!exists) {
list.add(value);
}
我认为如果要处理坐标,最好使用特定的 class,因为 Integer[]
仅对两个数字无用,并且会导致 contains()
和其他一些问题List
方法也像 .sort()
。
您最好创建一个 Coordinate
class,它将包含两个值:
public class Coordinate{
private int x;
private int y;
//getters and setters, constructor
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Coord)) {
return false;
}
Coordinate coord = (Coordinate) o;
return coord.x == x &&
coord.y == y;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + x;
result = 31 * result + y;
return result;
}
}
那么你可以使用:
LinkedList<Coordinate>
注:
请注意,这里使用 Set
实现会更好,它会防止坐标集中出现重复,因此我们不需要手动检查。
您可以使用 Stream
和 Set
来解决您的问题,如下所示:
List<Set<Integer>> list = new LinkedList<>();
list.add(Stream.of(1, 2).collect(Collectors.toSet()));
Set<Integer> s1 = new HashSet<>();
s1.add(1);
s1.add(2);
System.out.println(list.contains(s1));
Set<Integer> s2 = new HashSet<>();
s2.add(1);
s2.add(4);
System.out.println(list.contains(s2));
O/P:
正确
错误
N.B: 您可以使用 ArrayList
因为您也保留了序列。
如果你真的很想用 contains()
来做(或者出于任何原因别无选择),你可以这样实现:
final Integer[] newPair = {2, 3};
final boolean exists = values.contains(new Object()
{
// note that List.contains() javadoc explicitly specifies that
// newPair is used as the receiver not the argument for equals()
@Override
public final boolean equals(final Object listElement)
{
final Integer[] otherPair = (Integer[]) listElement;
return Arrays.equals(newPair, otherPair);
}
});