我对Java很陌生,我很难解决这个问题。
假设我有两个Arraylists personIdList
和titlelist
,它们在ResultSet Object迭代的帮助下被数据库填充。
personIdList.add(repPersonId.getLong("personID"));
titelList.add(repTitel.getString("titel"));
第一个Arraylist(personIdList
)包含来自不同作曲家的Ids,如下所示:
[34, 34, 34, 37, 38, 133, 232, 232, 285, 285, 285, 285]
第二个List(titlelist
)包含来自该作曲家的Title,如下所示:
[Symphonie, Sinfonia Concertante, Oper, Symphonie, Ouverture zur Oper, Ouverture zur Oper, Konzert für zwei Klaviere, Sinfonie, Chöre aus der Schauspielmusik, Requiem, Klavierkonzert, Klavierkonzert]
我可以以某种方式在这些数组之间建立连接吗?因为作曲家ID应该连接到相应的标题。
例如(伪代码):personIdList.get(34)应该给我所有连接到Id 34的标题。
我是否必须使用ArrayLists,或者已经有这样做了吗?
答案 0 :(得分:2)
正如RC所说。如果你不打算ORM Map it,你可以迭代id列表并创建一个新的Map(一个键值对集合):
Map<Integer, List<String> personTitles = new HashMap<>();
for(Integer id: personIdList) {
// your solution for retrieving the titles from the database
// i would imagine you're using an entityManager.query or something which returns the result set of the titles
// where you have to pass the `id` as a parameter
// and get the list of titles and store them in a List<String>
personTitles.put(id, `your retrieved List<String>`);
}
然后你可以说personTitles.get(32)
应该检索你的标题列表。
如果您可以发布更多关于如何从数据库中检索条目的代码,那将会有所帮助。
答案 1 :(得分:2)
您可以编写自己的收藏家,以创建所需的地图:
Map<Integer, List<String>> groupedIds = personIdList.stream()
.collect(new CustomCollector(titlelist.iterator()));
groupedIds.get(34); // [Symphonie, Sinfonia Concertante, Oper]
Bellow是定制收藏家。
public class CustomCollector implements Collector<Integer, Map<Integer, List<String>>, Map<Integer, List<String>>> {
private Iterator<String> iterator;
public CustomCollector(Iterator<String> iterator) {
this.iterator = iterator;
}
@Override
public Supplier<Map<Integer, List<String>>> supplier() {
return HashMap::new;
}
@Override
public BiConsumer<Map<Integer, List<String>>, Integer> accumulator() {
return (map, id) -> {
List<String> list = map.get(id);
if(list == null) {
list = new ArrayList<>();
list.add(iterator.next());
map.put(id, list);
} else {
list.add(iterator.next());
}
};
}
@Override
public BinaryOperator<Map<Integer, List<String>>> combiner() {
return (m1, m2) -> m1;
}
@Override
public Function<Map<Integer, List<String>>, Map<Integer, List<String>>> finisher() {
return HashMap::new;
}
@Override
public Set<Characteristics> characteristics() {
return Collections.emptySet();
}
}
答案 2 :(得分:2)
Guava(由Google提供)库中有一个很好的收集框架。如果您可以灵活使用外部jar,那么请使用guava库的多列表映射
ListMultimap<Integer, String> multimap = ArrayListMultimap.create();
multimap.put(repPersonId.getLong("personID"),(repTitel.getString("titel"));
它的作用是它为一个键接受多个值并将其存储在列表中。
如果您想要密钥列表,可以通过调用
将其设置为SetSet<Integer> keyset=multimap.getKeySet();
从multimap中检索值时,它返回列表结果
List<String> personTitles = multimap.get(personId);
这样您就可以检索数据,因此无需创建列表并将其设置为地图,这使得它比数组列表的地图更容易阅读
如果你甚至想要你的案例标题中的所有值,你可以通过
获得它Collection<String> titles=multimap.values();
无论如何,如果您不想要重复项,可以将集合转换为Set,如果您想要mulimap中的所有值而无需重复,则可以将其转换为List。
所以我认为与arraylists地图相比,这将非常方便且易于理解
答案 3 :(得分:1)
通常你应该使用一个对象并填充它......通常是ORM映射等等。
但是,如果你想要一个自制的解决方案,至少数组的id匹配?喜欢 arr1.get(1)与arr2.get(1)有关吗?