Java 将两个ArrayList相互连接

Java 将两个ArrayList相互连接,java,arrays,Java,Arrays,我对Java非常陌生,我很难解决这个问题 假设我有两个ArrayListpersonIdList和titlelist,在ResultSet对象迭代的帮助下由数据库填充 personIdList.add(repPersonId.getLong("personID")); titelList.add(repTitel.getString("titel")); 第一个Arraylist(personIdList)包含来自不同作曲家的ID,例如: [34, 34, 34, 37, 38, 133, 2

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

假设我有两个ArrayList
personIdList
titlelist
,在ResultSet对象迭代的帮助下由数据库填充

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]
[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]
第二个列表(
标题列表
)包含该作曲家的标题,如下所示:

[34, 34, 34, 37, 38, 133, 232, 232, 285, 285, 285, 285]
[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)应该给我所有连接到ID34的标题


我必须使用ArrayList吗?还是已经有这样的东西了?

通常你应该使用一个对象并填充它。。。。normaly是一个ORM映射,大约

但是,如果你想要一个自制的解决方案,至少数组的id匹配?喜欢
arr1.get(1)与arr2.get(1)相关吗

通常你应该使用一个对象并填充它。。。。normaly是一个ORM映射,大约

但是,如果你想要一个自制的解决方案,至少数组的id匹配?喜欢
arr1.get(1)与arr2.get(1)相关吗

正如RC所说。如果不打算对其进行ORM映射,可以迭代id列表并创建新映射(键值对集合):


Map如RC所说。如果不打算对其进行ORM映射,可以迭代id列表并创建新映射(键值对集合):


Map您可以编写自己的收集器来创建所需的映射:

Map<Integer, List<String>> groupedIds = personIdList.stream()
   .collect(new CustomCollector(titlelist.iterator()));
groupedIds.get(34); // [Symphonie, Sinfonia Concertante, Oper]
Map-groupedIds=personIdList.stream()
.collect(新的CustomCollector(titlelist.iterator());
groupedIds.get(34);//[交响乐、交响乐协奏曲、歌剧]
贝娄是定制的收藏家

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();
   }
 }
公共类CustomCollector实现收集器{
私有迭代器;
公共CustomCollector(迭代器迭代器){
this.iterator=迭代器;
}
@凌驾
公共供应商(){
返回HashMap::new;
}
@凌驾
公共双消费者累加器(){
返回(地图,id)->{
List=map.get(id);
if(list==null){
列表=新的ArrayList();
add(iterator.next());
地图放置(id、列表);
}否则{
add(iterator.next());
}
};
}
@凌驾
公共二进制运算符组合器(){
返回值(m1,m2)->m1;
}
@凌驾
公共函数完成器(){
返回HashMap::new;
}
@凌驾
公共集特征(){
返回集合;
}
}

您可以编写自己的收集器来创建所需的地图:

Map<Integer, List<String>> groupedIds = personIdList.stream()
   .collect(new CustomCollector(titlelist.iterator()));
groupedIds.get(34); // [Symphonie, Sinfonia Concertante, Oper]
Map-groupedIds=personIdList.stream()
.collect(新的CustomCollector(titlelist.iterator());
groupedIds.get(34);//[交响乐、交响乐协奏曲、歌剧]
贝娄是定制的收藏家

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();
   }
 }
公共类CustomCollector实现收集器{
私有迭代器;
公共CustomCollector(迭代器迭代器){
this.iterator=迭代器;
}
@凌驾
公共供应商(){
返回HashMap::new;
}
@凌驾
公共双消费者累加器(){
返回(地图,id)->{
List=map.get(id);
if(list==null){
列表=新的ArrayList();
add(iterator.next());
地图放置(id、列表);
}否则{
add(iterator.next());
}
};
}
@凌驾
公共二进制运算符组合器(){
返回值(m1,m2)->m1;
}
@凌驾
公共函数完成器(){
返回HashMap::new;
}
@凌驾
公共集特征(){
返回集合;
}
}

Guava(谷歌提供)图书馆有一个很好的收藏框架。如果您可以灵活地使用外部JAR,那么可以使用guava库中的multilistmap

ListMultimap<Integer, String> multimap = ArrayListMultimap.create();
multimap.put(repPersonId.getLong("personID"),(repTitel.getString("titel"));
ListMultimap multimap=ArrayListMultimap.create();
multimap.put(repPersonId.getLong(“personID”),(repTitel.getString(“titel”));
它所做的就是为一个键接受多个值,并将其存储在列表中

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

Set<Integer> keyset=multimap.getKeySet();
Set keyset=multimap.getKeySet();
从多重映射检索值时,它返回列表结果

List<String> personTitles = multimap.get(personId);
List personTitles=multimap.get(personId);
通过这种方式,您可以检索数据,因此无需创建列表并将其设置为映射,这比数组列表映射更易于读取

如果您甚至想要案例标题中的所有值,您可以通过

Collection<String> titles=multimap.values();
Collection titles=multimap.values();
无论如何,如果不需要重复项,可以将集合强制转换为Set,如果希望在mulimap中列出所有值,则可以不考虑重复项


因此,我认为与ArrayList地图相比,这将是非常方便和容易理解的。Guava(由Google提供)库中有一个很好的收集框架。如果您可以灵活地使用外部JAR,那么可以使用Guava库中的multilistmap

ListMultimap<Integer, String> multimap = ArrayListMultimap.create();
multimap.put(repPersonId.getLong("personID"),(repTitel.getString("titel"));
ListMultimap multimap=ArrayListMultimap.create();
multimap.put(repPersonId.getLong(“personID”),(repTitel.getString(“titel”));
它所做的就是为一个键接受多个值,并将其存储在列表中

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

Set<Integer> keyset=multimap.getKeySet();
Set keyset=multimap.getKeySet();
从多重映射检索值时,它返回列表结果

List<String> personTitles = multimap.get(personId);
List personTitles=multimap.get(personId);
通过这种方式,您可以检索数据,因此无需创建列表并将其设置为映射,这比数组列表映射更易于读取

如果您甚至想要案例标题中的所有值,您可以通过

Collection<String> titles=multimap.values();
Collection titles=multimap.values();
无论如何,如果您不想要重复的集合,可以将集合强制转换为Set,如果您想要al,则可以将列表强制转换为List