1

假设我在下面每个类都有一个对象,我将每个对象放在一个哈希图中,其中 IDnumber 是两个映射中的键。

class1 {
 int IDNumber = 123;  //same person as class2
 String name = John;
 String company = Intel;

 class2 { 
 int IDNumber = 123;  //same person as class1
 int income = 500;
 int workYears = 3;
 } 

HashMap<Integer, class1> one = new Hashmap<Integer, class1>();
HashMap<Integer, class2> two = new HashMap<Integer, class2>();

现在,我怎样才能将这两个 HashMap 混合成第三个 HashMap,以便我可以拥有键 IDnumber 以及值 name、company、income 和 workyears?

4

7 回答 7

2

你不能这样做。你有两个不同的类,java 不会自动神奇地将它们变成一个。

您可以创建一个新的第三类来合并信息:

public Class3 {

   public Class3(Class1 class1, Class2 class2){
       //pull the info you want from each into variables in this class
   }
}

然后遍历您的地图以获取条目,为每个条目创建新的 Class3 实例并将它们放在一个新的HashMap<Integer, Class3>.

//gets the keys from the hashmap
Set<Integer> keys = one.keySet();
//merge the keys from the second hashmap
keys.addAll(two.keySet());
//new hashmap
Map<Integer, Class3> newMap = new HashMap<Integer, Class3>();
for (Integer key : keys){
     //create new instance and place it in the map
     newMap.put(key, new Class3(one.get(key), two.get(key));
}
于 2012-11-08T15:53:09.753 回答
1

创建以Combined以下两种方式之一调用的第 3 类:

Combined {
    class1 info1;
    class2 info2;
}

或更好:

Combined {
    int IDNumber = 123;
    String name = John;
    String company = Intel;
    int income = 500;
    int workYears = 3;
}
  • 创建第三个(空)HashMap
  • 现在遍历您之前拥有的第一个 HashMap 中的所有元素
  • 对于每个条目,在第二个 HashMap 中查找相同的键:
    • 如果找到,则将这两个条目中的信息组合起来,并将其作为实例的单个条目添加Combined到第三个 HashMap。然后从 HashMap 1 和 2 中删除这两个条目。
    • 如果未找到,则Combined无论如何都基于 HashMap 1 中的条目创建一个实例,并将来自 HashMap 2 的相应条目的不可用信息设置为 null。从 HashMap 一中删除条目。
  • 现在第一个 HashMap 应该是空的。迭代 HashMap 2 以查找 HashMap 1 中没有对应 ID 的任何条目。如上所述将它们添加到第三个 HashMap 中。
于 2012-11-08T15:58:35.800 回答
1

您不能在 java.util.Map 中使用相同的键存储多个值(即在您的情况下为 Class1 和 Class2)。你想要的是一个MultimapGuava对此有一个实现。您正在寻找的是ArrayListMultimap

于 2012-11-08T15:58:50.003 回答
0

由于您的数据结构不是孤立的,您应该使用一些适配器/包装器

public class UserClassWrapper {

  private final UserClass1 class1;
  private final UserClass2 class2;

  UserWithDetail(UserClass1 class1, UserClass2 class2) {
    //Check preconditions as class1 and class2 must not be null and have equal id
    this.class1 = class1;
    this.class2 = class2;
  }

}

然后在您的代码中,您可以声明一个地图:

private Map<Integer,UserClassWrapper> userClassWrappeMap = new HashMap<>();
于 2012-11-08T16:04:38.770 回答
0

你需要创建一个新的类,它是它的混搭,class1class2带有一个新Map的类。每次你把东西放进去one和“两个”,你都会做一个mashup包含这两个对象的新东西,然后把它放进three.

于 2012-11-08T15:57:34.350 回答
0

您可以使用 ArrayList 为一个键创建具有多个值的 HashMap

ArrayList<> list = new ArrayList();

/* populate your list here with two class having the same ID */

HashMap<Integer, List> three = new Hashmap();

/* Put list on the Hashmap */

/* Redo the operation with another ID */

但它不是很优化,如果你没有义务在最后有一个HashMap,直接使用一个multiHashMap:http ://commons.apache.org/collections/apidocs/org/apache/commons/collections/MultiHashMap.html

于 2012-11-08T16:01:50.183 回答
-1

你期待这样的安排吗

class class1 {
 int IDNumber = 123;  //same person as class2
 String name = "John";
 String company = "Intel";
 }

 class class2 { 

 int IDNumber = 123;  //same person as class1
 int income = 500;
 int workYears = 3;
 } 


 public class MyData{
public static void main(String arg[]){
    HashMap<Integer, class1> one = new HashMap<Integer, class1>();
    HashMap<Integer, class2> two = new HashMap<Integer, class2>();
    one.put(1, new class1());
    two.put(2, new class2());

    HashMap<Integer, Object> three = new HashMap<Integer, Object>();
    three.putAll(one);
    three.putAll(two);

    System.out.println(three);
}
 }
于 2012-11-08T16:08:45.203 回答