我有两个数组列表,一个是保存名称,另一个是保存数量。我想避免在数组列表中重复。名称数组列表包含名称,其对应的数量包含在数量数组列表中。
我的数组列表可以包含重复的名称,我想遍历数组列表以检查名称是否已存在,如果存在则将数量添加到前一个值并删除重复条目。
例如
Name Quantity
ABC 20
xyz 10
ABC 15
需要输出
Name Quantity
ABC 35
XYZ 10
谢谢
您应该使用 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);
}
您尝试表示的结构类似于应该由 a 表示的东西Map
,它是结构的键 -> 值存储类型。拥有两个列表并尝试保持同步是一个坏主意。
使用java.util.Map
where 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);
如果您想在 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}
这是在 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");
}
}
我已经测试了输出,它是正确的。