【问题标题】:How can I add (+) an integer to an element in a 2-dimensional ArrayList?如何向二维 ArrayList 中的元素添加 (+) 整数?
【发布时间】:2025-12-08 09:25:01
【问题描述】:

我正在尝试将 1 添加到二维 ArrayList 中的整数。

我使用set() 方法和element + 1 作为第二个参数,但“+ 1”不起作用。当我检索元素时,它将它定义为一个对象,而不是一个整数。我该如何解决这个问题?

代码:

ArrayList<ArrayList> inventoryList = new ArrayList(
    Arrays.asList(new ArrayList<String>(), new ArrayList<Integer>()));

...

(inventoryList.get(1)).set(i, ((inventoryList.get(1)).get(i) + 1));

错误:

Main.java:47: error: bad operand types for binary operator '+'
                (inventoryList.get(1)).set(i, ((inventoryList.get(1)).get(i) + 1));
                                                                             ^

我的代码是this ideone page。这段代码是从 python 翻译过来的,我目前正在调试它,所以不用担心其他错误。

【问题讨论】:

  • 你试过ArrayList&lt;ArrayList&lt;Integer&gt;&gt;而不是ArrayList&lt;ArrayList&gt;吗?
  • 你能出示inventoryList的声明声明吗?
  • 它由两个ArrayList组成,一个是字符串,一个是整数,所以ArrayList&lt;ArrayList&lt;Integer&gt;&gt;不起作用;我做到了ArrayList&lt;ArrayList&gt; inventoryList = new ArrayList( Arrays.asList(new ArrayList&lt;String&gt;(), new ArrayList&lt;Integer&gt;()));
  • 您的库存应该是Map&lt;String, Integer&gt;

标签: java arraylist


【解决方案1】:
ArrayList<ArrayList> inventoryList = ...

您正在为内部列表使用 ArrayList 的原始变体,这样的 ArrayList 确实包含对象而不是整数。你不应该使用那些原始的 ArrayList,而应该使用通用的:

What is a raw type and why shouldn't we use it?

再看一下您的代码,似乎inventoryList 应该包含两个列表,一个包含您拥有的项目(作为字符串),另一个包含您拥有的项目数量(作为整数),您可以在其中找到如何通过查看同一索引 i 的第二个列表,您可以在第一个列表中的索引 i 处找到许多项目。

如果这是正确的,有多种方法可以解决这个问题,确实,将对象转换为整数是可行的,但是你仍然使用原始类型,你可能不应该这样做。要解决此问题,您不应该将ArrayList&lt;String&gt;ArrayList&lt;Integer&gt; 保留在同一个列表中。你可以有:

ArrayList<String> inventoryItems = ...
ArrayList<Integer> inventoryItemCounts = ...

单独(如果它总是包含 2 个项目,一个字符串列表和一个整数列表,则不需要列表)。然而,正如 user2418306 在 cmets 中所建议的那样,更清洁的解决方案是使用地图

Map<String, Integer> inventory = ...

http://docs.oracle.com/javase/7/docs/api/java/util/Map.html,这样你库存中的每个字符串(项目)都有一个对应的整数(你拥有的那个项目的数字),你不必使用“在同一索引”技巧来获得它。

不过,看看你的代码,我会说库存有更多问题。您使用以下方式打印库存:

for (int i = 0; i < inventoryList.size(); i++){
    System.out.println((inventoryList.get(1)).get(i) + " : " + (inventoryList.get(0)).get(i));
}

并且您在其他地方也以这种方式遍历它。但是,如果我没有误解任何内容,inventoryList.size() 将始终为 2(inventoryList 包含 2 个列表,一个是字符串,一个是整数)。要获得库存中不同项目(字符串)的数量,您必须执行inventoryList.get(0).size()(或inventoryList.get(1).size(),因为这将是相同的)。但是,如果您为库存选择更好的数据类型,事情会变得更容易。我会查看提到的地图。使用它,您可以使用inventory.size() 轻松获得正确的号码。

【讨论】:

  • 但这不是两个整数数组列表,这是整数之一和字符串之一。
  • 好点,只看了一眼代码,在回答之前应该看起来更好。所以,再看一点,我试着修正一下我的答案..
【解决方案2】:

你可以通过转换为整数来解决你的问题

inventoryList.get(1).set(i, (Integer) inventoryList.get(1).get(i)+1);

当然,首先查看您问题下方的 cmets 以了解如何正确初始化您的列表,因此您不需要显式强制转换。

【讨论】:

    【解决方案3】:

    按照声明的方式,您的列表是Object 的列表。您需要将第二个get() 的结果转换为(Integer),例如:

    inventoryList.get(1).set(i, (Integer)inventoryList.get(1).get(i)+1);
    

    注意:有不需要的()

    【讨论】: