簡體   English   中英

相互連接兩個ArrayList

[英]Connect two ArrayLists with each other

我對Java還是很陌生,我很難解決這個問題。

可以說我有兩個Arraylists personIdListtitlelist ,它們通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM