[英]Connect two ArrayLists with each other
我對Java還是很陌生,我很難解決這個問題。
可以說我有兩個Arraylists personIdList
和titlelist
,它們通過ResultSet Object迭代由數據庫填充。
personIdList.add(repPersonId.getLong("personID"));
titelList.add(repTitel.getString("titel"));
第一個Arraylist( personIdList
)包含來自不同作曲家的ID,如下所示:
[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或已經有這樣做的東西?
正如RC所說。 如果您不打算使用ORM Map,則可以迭代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)
,它應該檢索您的標題列表。
如果您可以發布更多有關如何從數據庫中檢索條目的代碼,那將很有幫助。
您可以編寫自己的收集器,以創建所需的地圖:
Map<Integer, List<String>> groupedIds = personIdList.stream()
.collect(new CustomCollector(titlelist.iterator()));
groupedIds.get(34); // [Symphonie, Sinfonia Concertante, Oper]
貝婁是定制的收藏家。
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();
}
}
Guava(由Google提供)庫中有一個很好的收集框架。 如果您靈活地使用外部jar,請使用guava庫中的multilistmap
ListMultimap<Integer, String> multimap = ArrayListMultimap.create();
multimap.put(repPersonId.getLong("personID"),(repTitel.getString("titel"));
因此,它的作用是為一個鍵接受多個值並將其存儲在列表中。
如果您想要按鍵列表,可以通過調用將它們設置為Set
Set<Integer> keyset=multimap.getKeySet();
從多圖檢索值時,它返回列表結果
List<String> personTitles = multimap.get(personId);
這樣,您可以檢索數據,因此無需創建列表並將其設置為映射,這比數組列表的映射更易於閱讀
如果您甚至想要案例標題中的所有值,則可以通過以下方式獲取
Collection<String> titles=multimap.values();
無論如何,如果您不希望重復,可以將集合強制轉換為Set;如果想要mulimap中的所有值而不考慮重復,則可以強制將List強制轉換為List。
因此,我認為與arraylist的映射相比,這將非常方便並且易於理解
通常,您應該使用一個對象並填充它。...通常是ORM映射。
但是,如果要自制解決方案,至少Arrays的id匹配? 就像arr1.get(1)與arr2.get(1)相關嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.