gpt4 book ai didi

java - 用于存储具有唯一 id 组合的对象的集合

转载 作者:行者123 更新时间:2023-12-02 13:32:55 27 4
gpt4 key购买 nike

我有一个带有属性的测试类

--> Integer id1
--> Integer id2
--> String stringValue.

因此,每个(id1 和 id2)唯一 id 组合都有 stringValues 列表。我希望能够将其存储在一个集合中。示例:

  test1 : id1 = 1, id2 = 2 , stringValue = one
test11 : id1 = 1, id2 = 2 , stringValues =two
test111 : id1 = 1, id2 = 3 , stringValues =three
test2 : id1 = 5, id2 = 3, stringValues = four
test22: id1 = 5, id2 = 2, stringValues = five
test222: id = 5, id2 = 3, stringValues = six

期望的最终结果是将对象存储为

-> {id = 1, id = 2, String = {one, two} } 
-> {id = 1 , id =3 , String = {three}}
-> {id = 5, id = 3 , String = {four,six}}
-> {id = 5, id = 2 , String = {five}}

我希望能够将“测试”对象列表存储在集合中。我尝试了 Set<> ,覆盖 equals 和 hashcode 但它没有按预期工作。给你吧

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id1 == null) ? 0 : id1.hashCode());
result = prime * result + ((id2 == null) ? 0 : id2.hashCode());
return result;
}


@Override
public boolean equals(Object obj) {
if( obj instanceof Test){
Test test = (Test) obj;
return (test.id1 == this.id1 && test.id2 == this.id2);
} else {
return false;
}
}

我循环遍历每个对象并将其存储在一个集合中。它确实消除了([id1和id2]的冗余组合,但它也消除了各自的字符串值。)哎呀,我忘了提及我从数据库检索的结果集中获取数据。所以每一行都包含 id1、id2 和一个字符串值(所有行都不同)。某些行将具有共同的 id1 和 id2 值

有人可以给我建议吗?

提前谢谢

最佳答案

这能解决您的问题吗?

import java.util.*;

public class Playground1 {
public static void main(String[] args) {

// fake resultset
List<DBResultSetRowEmulation> resultSetEmulation = new ArrayList<>();
resultSetEmulation.add(new DBResultSetRowEmulation(1, 2, "one"));
resultSetEmulation.add(new DBResultSetRowEmulation(1, 2, "two"));
resultSetEmulation.add(new DBResultSetRowEmulation(1, 3, "three"));
resultSetEmulation.add(new DBResultSetRowEmulation(5, 3, "four"));
resultSetEmulation.add(new DBResultSetRowEmulation(5, 2, "five"));
resultSetEmulation.add(new DBResultSetRowEmulation(5, 3, "six"));

Map<DoubleIndex, List<String>> resultData = new HashMap<>();

// iterate through resultset
for(DBResultSetRowEmulation row: resultSetEmulation) {
DoubleIndex curRecordIdx = new DoubleIndex(row.a, row.b);
if (resultData.containsKey(curRecordIdx)) {
// append current string to some existing id1+id2 combination
resultData.get(curRecordIdx).add(row.c);
} else {
// create a new list for new id1+id2 combination
resultData.put(curRecordIdx, new ArrayList<>(Collections.singletonList(row.c)));
}
}

System.out.println(resultData);
}

private static class DBResultSetRowEmulation {
Integer a, b;
String c;

DBResultSetRowEmulation(Integer a, Integer b, String c) {
this.a = a;
this.b = b;
this.c = c;
}
}

private static class DoubleIndex {
private Integer a,b;

public DoubleIndex(Integer a, Integer b) {
this.a = a;
this.b = b;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

DoubleIndex that = (DoubleIndex) o;

return a.equals(that.a) && b.equals(that.b);
}

@Override
public int hashCode() {
int result = a.hashCode();
result = 31 * result + b.hashCode();
return result;
}

@Override
public String toString() {
return "id{" +
"a=" + a +
", b=" + b +
'}';
}
}
}

输出:

{id{a=1, b=2}=[one, two],

id{a=1, b=3}=[three],

id{a=5, b=2}=[five],

id{a=5, b=3}=[four, six]}

您必须自己弄清楚如何对结果进行排序。

关于java - 用于存储具有唯一 id 组合的对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43125641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com