将两个ArrayLists相互连接

时间:2017-07-29 18:15:30

标签: java arrays

我对Java很陌生,我很难解决这个问题。

假设我有两个Arraylists personIdListtitlelist,它们在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,或者已经有这样做了吗?

4 个答案:

答案 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"));

它的作用是它为一个键接受多个值并将其存储在列表中。

如果您想要密钥列表,可以通过调用

将其设置为Set
Set<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)有关吗?