java 我如何对列表中相邻的数字求和,并将求和结果添加到同一列表中要求和的数字之间?

camsedfj  于 2022-12-21  发布在  Java
关注(0)|答案(2)|浏览(134)

列表基本上需要从(例如)324到35264,其中5是3和2的和,6是2和4的和。列表中的数字是手动键入的,并且列表可以具有无限大小。
我想我已经有了基数(如果你可以这么称呼它的话),但是我不确定我如何精确地对列表中的特定数字求和。

import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    List<Integer> list = new LinkedList<Integer>();
    
    int number;
    while (true){
      number = sc.nextInt();
      if(number==0)break;

      if(list.size()==0)
        list.add(number);
      else{

        // here's where I think the sum of numbers should be
        
        }
        list.add(i,number);
      }
    }
    System.out.println("result:");
    
        for (int n : list) {
            System.out.print(n + " ");
    }

    sc.close();
  }
}
qxsslcnc

qxsslcnc1#

我不知道您正在使用的i是什么(我没有看到它在任何地方声明),但您不需要它。
循环的行为如下所示:

int number;
while (true) {
  number = sc.nextInt();
  if(number==0)
      break;
  if(list.size() == 0) {
    list.add(number);
  } else{
    list.add(list.get(list.size()-1) + number);
    list.add(number);
  }
}

编辑:我看到你想要每对连续输入数字的总和。

  • 如果列表为空,则只需将第一个数字添加到列表中。
  • 否则,将添加到列表中的最后一个元素与新输入数之和相加,然后添加新输入数。
0lvr5msh

0lvr5msh2#

一个更通用的方法是,按照the first principle of SOLID的建议,将用户的输入和处理列表的职责分开,这样就可以重用逻辑,而不管列表来自何处。

创建新列表

解决这个问题的方法之一是生成一个新的List,并在迭代原始列表的同时用原始列表中的元素及其总和填充它。
看起来可能是这样的:

public static List<Integer> addSumBetweenElements(List<Integer> list) {
    if (list.isEmpty()) return Collections.emptyList();
    
    List<Integer> result = new ArrayList<>();
    int prev = list.get(0);
    result.add(prev);
    
    for (int i = 1; i < list.size(); i++) {
        int next = list.get(i);
        result.add(prev + next);
        result.add(next);
        prev = next;
    }
    return result;
}

第一个月

public static void main(String[] args) {
    System.out.println(addSumBetweenElements(List.of(1, 2, 3)));
}
  • 输出:*
[1, 3, 2, 5, 3]

ListIterator-修改原始列表

如果您的目标是修改原始列表,则可以使用ListIterator提供的功能。
关于迭代器,要记住的关键一点是,它们总是占据元素之间的位置***(* 或者在第一个元素之前,或者在最后一个元素之后 *)。并且正在调用方法ListIterator.add(),一个新元素被插入到 previous 之后(可以通过previous()调用 * 检索的 *)和 next 元素(可以通过调用next() * 获得的 *)。

public static List<Integer> addSumBetweenElements(List<Integer> list) {
    
    ListIterator<Integer> iterator = list.listIterator();
    int prev = iterator.next();
    
    while (iterator.hasNext()) {
        int next = iterator.next(); // advance one position forward to retrieve next element
        iterator.previous();        // move one step back (in between the previous and next elements)
        iterator.add(prev + next);  // insert a new element
        iterator.next();            // move one step forward (past the next element which has been processed)
        prev = next;
    }
    return list;
}

main()

public static void main(String[] args) {
    System.out.println(addSumBetweenElements(new LinkedList<>(List.of(1, 2, 3))));
}
  • 输出:*
[1, 3, 2, 5, 3]

相关问题