2014-09-04 41 views
0

将所有的人的数量我有一个Person类用相同的ID从HashMap中

public class Person { 
    private int id; 
    private int amount; 
    public Person(int id, int amount){ 
     this.id = id; 
     this.amount = amount; 
    } 
//getters 
} 

而且我有一个mainClass这样

Map<String, Person> mapOfObjects = new HashMap<String, Person>(); 
mapOfObjects.put("map1", new Person(1, 1000)); 
mapOfObjects.put("map2", new Person(1, 1000)); 
mapOfObjects.put("map3", new Person(1, 1000)); 
mapOfObjects.put("map4", new Person(2, 1000)); 
mapOfObjects.put("map5", new Person(2, 1000)); 
mapOfObjects.put("map6", new Person(3, 1000)); 
Map<Integer, Integer> mapOfSum = new HashMap<Integer, Integer>(); 
int sum = 0; 
List list = new LinkedList(mapOfObjects.keySet()); 
for (int i = 0; i < mapOfObjects.size(); i++) { 
    for (int j = 1; j < mapOfObjects.size() - i; j++) { 
     if (mapOfObjects.get(list.get(i)).getId() == 
      mapOfObjects.get(list.get(j)).getId()) { 
       sum += (mapOfObjects.get(list.get(i)).getAmount() + 
         mapOfObjects.get(list.get(j)).getAmount()); 
     } 
     mapOfSum.put(mapOfObjects.get(list.get(i)).getId(), sum); 
    } 
} 
System.out.println(mapOfSum); 

它给我的输出:

{1=8000, 2=8000, 3=0} 

但我想要这样的东西

id=1 amount =3000, id =2 amount = 2000, id =3 amount =1000 

如何从它的总和,同时运行的第一个for循环

+0

你的问题不明确。请尝试解释你正在努力做的更好 – amit 2014-09-04 10:17:45

+0

循环内部的'if'可能是错误的,你总是比较'mapOfObjects.get(list.get(i))。getId()'和它自己。 – usr2564301 2014-09-04 10:18:45

+0

我想添加所有金额相同的人 – Sarbong 2014-09-04 10:19:22

回答

0

你的循环已经做一次是过度设计的地图中删除对象。

试试这个:

for (Person person : mapOfObjects.values()) //for every person in the map... 
{ 
    int newAmount = 0; 
    if (mapOfSum.containsKey(person.getId())) //if its already in the sumMap 
    { 
     newAmount = mapOfSum.get(person.getId()) + person.getAmount(); //update the value 
    } 
    else 
    { 
     newAmount = person.getAmount(); //else set it as starting value 
    } 
    mapOfSum.put(person.getId(), newAmount); //put it in the sum map. If it's already there it will be substituted by new entry. 
} 

输出:

{1=3000, 2=2000, 3=1000} 

编辑

如果你想在不同的格式输出,你可以做这样的事情:

StringBuilder stringBuilder = new StringBuilder(""); 
for (Map.Entry<Integer, Integer> entry : mapOfSum.entrySet()) 
{ 
    stringBuilder.append("id=").append(entry.getKey()).append(" amount=").append(entry.getValue()).append(", "); 
} 

System.out.println(stringBuilder.toString()); 

输出:

id=1 amount=3000, id=2 amount=2000, id=3 amount=1000, 

EDIT2:

正如@NickHolt建议在评论着,是通过消除containsKey()检查缩短执行时间,更有效的方式。

这是可以做到这样的:

Integer personAmount = mapOfSum.get(person.getId()); 
if (personAmount == null) 
{ 
    personAmount = person.getAmount(); 
} 
else 
{ 
    personAmount = person.getAmount() + personAmount; 
} 
mapOfSum.put(person.getId(), personAmount); 

或在较短的形式使用三元运算符:

Integer personAmmount = mapOfSum.get(person.getId()); 
personAmmount = personAmmount == null ? person.getAmount() : person.getAmount() + personAmmount; 
mapOfSum.put(person.getId(), personAmount); 
+0

谢谢containsKey是所有的力量来到我的脑海 – Sarbong 2014-09-04 10:36:45

+0

@Sarbong很高兴我能帮上忙。 – 2014-09-04 10:39:53

+0

从'mapOfSum'中'get'到'sum'变量首先检查'null',而不是'containsKey'后面跟'get' - 这是更有效的:'Integer sum = mapOfSum。 get(persion.getId())'更新'mapOfSum'像这样:'mapOfSum.put(persion.getId(),sum!= null?sum + person.getAmount():person.getAmount())' – 2014-09-04 10:44:56

0

您可以使用谷歌番石榴多重映射

Multimap<Integer, Integer> PersonMap = ArrayListMultimap.create(); 
PersonMap.put(1, 1000); 
PersonMap.put(1, 1000); 
PersonMap.put(1, 1000); 
PersonMap.put(2, 1000); 
PersonMap.put(2, 1000); 
PersonMap.put(3, 1000); 

然后你可以使用例如:

Hashset<Integer, Integer> PersonDictionary = new Hashset<Integer, Integer>(); 
for (Integer key: PersonMap.keySet()) 
    PersonDictionary.Add(key, Sum(PersonMap.get(key))); 

其中sum函数:Is there possibility of sum of ArrayList without looping

0

而不是使用两个for循环中,使用单,遍历设置地图的价值,并找到总和

Map<String, Person> mapOfObjects = new HashMap<String, Person>(); 
mapOfObjects.put("map1", new Person(1, 1000)); 
mapOfObjects.put("map2", new Person(1, 1000)); 
mapOfObjects.put("map3", new Person(1, 1000)); 
mapOfObjects.put("map4", new Person(2, 1000)); 
mapOfObjects.put("map5", new Person(2, 1000)); 
mapOfObjects.put("map6", new Person(3, 1000)); 
Map<Integer, Integer> mapOfSum = new HashMap<Integer, Integer>(); 
for (Person person : mapOfObjects.values()) { 
    Integer value= mapOfSum.get(person.getId()); 
    if (value == null) { 
     value = 0; 
    } 
    value += person.getAmount(); 
    mapOfSum.put(person.getId(), value); 
} 
System.out.println(mapOfSum);