2

我有两个数组列表,一个是保存名称,另一个是保存数量。我想避免在数组列表中重复。名称数组列表包含名称,其对应的数量包含在数量数组列表中。

我的数组列表可以包含重复的名称,我想遍历数组列表以检查名称是否已存在,如果存在则将数量添加到前一个值并删除重复条目。

例如

Name     Quantity
ABC      20
xyz      10
ABC      15

需要输出

Name    Quantity
ABC      35
XYZ      10

谢谢

4

6 回答 6

3

您应该使用 aMap代替,这将不允许重复条目。你使用它是这样的:

Map<String, Integer> nameToQuantityMap = new HashMap<String, Integer>():

nameToQuantityMap.put("Mr Smith", 100);
nameToQuantityMap.put("Mrs Jones", 500);

编辑:既然您已经编辑了问题,答案就不同了。如果要添加重复键的值,则必须执行以下操作:

// For each (name, quantity) pair
if (nameToQuantityMap.containsKey(name) ) {
    Integer sum = nameToQuantityMap.get(name) + quantity;
    nameToQuantityMap.put(name, sum);
}
else {
        nameToQuantityMap.put(name, quantity);
}
于 2013-04-16T07:43:45.997 回答
0
I want to avoid duplicate in the array list. 

在这种情况下使用HashSet

否则,如果您有 2 个并行 ArrayList,那么您可以使用HashMap

于 2013-04-16T07:42:34.553 回答
0

您尝试表示的结构类似于应该由 a 表示的东西Map,它是结构的键 -> 值存储类型。拥有两个列表并尝试保持同步是一个坏主意。

于 2013-04-16T07:43:55.100 回答
0

使用java.util.Mapwhere key 是你的 map,value 是 value。

Map<String,Integer> map = new HashMap<>();
if(map.get(name)!=null){
    Integer oValue = map.get(name)+nNalue;
}else
   map.put(name,value);
于 2013-04-16T07:44:36.170 回答
0

如果您想在 Key 已存在的情况下为先前的值添加值,请尝试此操作。

 public class Example {
    static Map<String, Integer> map = new HashMap<String, Integer>();

    public static void main(String[] args) {

        insertNameAndQuantity("A", 10);
        insertNameAndQuantity("B", 25);
        insertNameAndQuantity("A", 25);
        System.out.println(map);
    }

    public static void insertNameAndQuantity(String key, Integer value) {

        Integer count = map.get(key);
        if (count == null)
            map.put(key, value);
        else
            map.put(key, count + value);

    }
}

输出:

{A=35, B=25}
于 2013-04-16T07:50:22.613 回答
0

这是在 c# 代码上实现的示例。

public class temp
{
    [Test]
    public void T()
    {
        var list1 = new ArrayList(){"ABC", "xyz", "ABC"};
        var list2 = new ArrayList() {20, 10, 15};

        var nameList = new List<string>();
        var list1result = new ArrayList();
        var list2result = new ArrayList();

        int index = 0;
        foreach (string name in list1)
        {
            if (!nameList.Contains(name))
            {
                list1result.Add(name);
                var quantity = list2[index] ?? 0;
                list2result.Add(quantity);
                nameList.Add(name);
            }
            else
            {
                var index2 = 0;
                foreach (string name2 in list1result)
                {
                    if (name2 == name)
                    {
                        list2result[index2] = (int)list2result[index2] + (int)list2[index];
                    }
                    index2++;
                }
            }
            index++;
        }

        Assert.True(list1result.Count == 2, list1result.Count + " t1");
    }

}

我已经测试了输出,它是正确的。

于 2013-04-16T08:08:27.853 回答