在Java中,ArrayList中增加整数的最佳方法是什么?

9
什么是在ArrayList中递增一个整数的最简洁方式?
ArrayList<Integer> ints = new ArrayList<>();
ints.add(5);
ints.add(9);

如何最简洁地增加列表中最后一个元素的值?

对我来说,ints.set(ints.size() - 1, ints.get(ints.size() - 1) + 1); 看起来相当丑陋。


3
虽然有很多 Java 代码看起来相当丑陋,但我认为你可以将其封装在一个方法中,这样可以使你的主要代码更加整洁。 - Dave Newton
1
我同意 @DaveNewton 的观点。我看不到更好的方法,但我会将其封装在一个方法中以提高可读性和可测试性。 - Robert Bain
int lastIndex = ints.size() - 1; int lastValue = ints.get(lastIndex); ints.set(lastIndex, lastValue + 1); - Maxim
5个回答

19

由于Integer对象是不可变的,因此无法就地增加值。您必须在ArrayList中的特定位置获取先前的值,将其递增,并使用它替换该位置上的旧值。

int index = 42; // whatever index
Integer value = ints.get(index); // get value
value = value + 1; // increment value
ints.set(index, value); // replace value

或者,使用可变整数类型,比如AtomicInteger(或编写自己的类型)。


11

也许您需要使用另一种数据结构?

LinkedList<AtomicInteger> ints = new LinkedList<AtomicInteger>();
ints.add(new AtomicInteger(5));
ints.add(new AtomicInteger(9));

ints.getLast().incrementAndGet();

即使AtomicInteger没有自动装箱,但使用LinkedList和AtomicInteger可以使代码更加清晰。 - WVrock
1
但编程不仅仅是美学问题。如果没有并发问题,为什么要使用Atomic*呢?这是不必要的开销。不同的数据结构应该基于用例而不是外观来使用。 - nanosoft
当你在做一个小项目时 - 我同意你的想法。但是,当你有一个由400-500名开发人员组成的团队时... 可读性和可维护性变得最为重要。即使这意味着“额外负担”,使用标准结构也是必要的。 - ursa
在这种情况下,最好创建一个包装int并具有increment()方法的自定义类,而不是使用AtomicInteger带来的开销。 - Nikolay Dimitrov

1
我做了类似这样的事情:

arraylistofint.set(index, arraylistofint.get(index) + 1);

这是我的代码中的一个示例(已修改名称):

ArrayList<Integer> numBsPerA = new ArrayList<> ();
...
int cntAs = 0;
int cntBs = 0;
for ( TypeA a : AnArrayListOfAs )
   {
      numBsPerA.add(0);
      for ( TypeB b : a.getAnArrayListOfBs() )
      {
         numBsPerA.set(cntAs, numBsPerA.get(cntAs) + 1);
         cntBs++;
      }
      System.out.println(a.toString()+ " has "
                        +numBsPerA.get(cntAs)+" TypeBs");
      cntAs++;
   }
   System.out.println("Total number of As: "+cntAs); 
   System.out.println("Total number of Bs: "+cntBs);
   // can now loop over numBsPerA to check how many Bs per A or whatever.

0

我可以使用Java编写代码来完成...在那里,我们可以递增列表的每个元素

List<Integer> list= new ArrayList<Integer>();
  //int[] primitive = List1.toArray(list1);
  int count=0;
  int count1=0;
  int k=0;
  list.add(3);list.add(2);list.add(3);list.add(5);
  System.out.println("The given input is");
  for(int i:list){
      System.out.println(i);
  }
  Integer[] a = list.toArray(new Integer[list.size()]);
  for(int i = 0; i <a.length; i++)
    {
        if(i==a.length-1){
            a[i]++;
            count++;
        }else if(i==a.length-2){
            a[i]++;
            count++;
        }else if(i==a.length-3){
            a[i]++;
            count++;
        }else if(i==a.length-4){
            a[i]++;
            count++;
        }

    }
  System.out.println("After first operation");
  for(int i:a){
      System.out.println(i);
  }

  System.out.println("the first count is"+count);
  for(int i = 0; i <a.length; i++)
    {
        if(i==a.length-1){
            a[i]--;
            count1++;
        }else if(i==a.length-2){
            a[i]--;
            count1++;
        }else if(i==a.length-3){
            a[i]--;
            count1++;
        }else if(i==a.length-4){
            a[i]--;
            count1++;
        }

    }

   for(int i:a){
      System.out.println(i);
  }
   System.out.println("the second count is"+count1);
  //int Count2=count+count1;
   System.out.println("After second operation");



  System.out.println("--------------------------------------------");
  for(int j:a){
      System.out.println(j);
  }
 List<Integer> list1=Arrays.asList(a);

  System.out.println("After conversion of list");
  for(int i:list1){
      System.out.println(i);
  }

我也做了这个计数...

这个问题在面试中也被问到了...


0
你可以始终使用普通数组:
int[] ints = new int[10];

++ints[9];
// or
++ints[ints.length - 1];

注意:然而,通常来说,坚持使用 List 更为安全。

  1. 如果你有很多递增操作,可以编写一个简短的代码片段:
private static void increment(List<Integer> list, int ind) {
    list.set(ind, list.get(ind) + 1);
}

List<Integer> list = new ArrayList<>();
list.add(5);
list.add(15);

increment(list, list.size() - 1);

注意:即使您只需要在一个函数中增加一次,为了可读性,编写这样的代码片段也是值得的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接