Как вы находите сумму определенных элементов в массиве в Java

1

Я пытаюсь получить sumSection чтобы суммировать элемент, который звонит бегун, но я не уверен, как это сделать?

package com.company;

public class processser
{
    //instance variables and constructors could be present, but are not necessary

    //sumSection will return the sum of the numbers
    //from start to stop, not including stop
    public static int sumSection(int[] numArray, int start, int stop)
    {
        int sum = 0;
        {
            for (int i : numArray)
                sum += i;
        }
        return sum ;
    }

    //countVal will return a count of how many times val is present in numArray
    public static int countVal(int[] numArray, int val)
    {
        int count = 0;
        for (int item : numArray)
        {
            if (item == val)
            {
                count = count + 1;
            }
        }
        return count;
    }
}

Вот бегун:

package com.company;

import static java.lang.System.*;
import java.lang.Math;
import java.util.Arrays;

public class Main
{
    public static void main(String args[])
    {
        int[] theRay = {2,4,6,8,10,12,8,16,8,20,8,4,6,2,2};

        out.println("Original array : "+ Arrays.toString(theRay));

        out.println("Sum of 0-3: " + processser.sumSection(theRay, 0, 3));

    }
}

Я пытаюсь получить сумму позиций в моем массиве 0-3. Я пробовал все, что знаю в java, но не понимаю, как получить сумму 0-3 в массиве, используя sumSection

  • 0
    Если вы используете List s вместо массивов, вы можете просто вызвать List.subList() чтобы получить представление List содержащее только те элементы, которые вы хотите суммировать.
  • 0
    Не уверен, почему никто не опубликовал ссылку на использование / структуры циклов for и foreach
Теги:

3 ответа

3

Вы можете использовать потоки Java 8:

static int sumSection(int[] numArray, int start, int stop) {
    return IntStream.range(start, stop).map(i -> numArray[i]).sum();
}

Это происходит от start до stop (эксклюзивно), поэтому, если у вас есть:

int[] theRay = {2,4,6,8,10,12,8,16,8,20,8,4,6,2,2};
sumSection(theRay, 0, 3);

Это будет примерно так:

IntStream.range(0, 3) -> [0, 1, 2]
[0, 1, 2].map(i -> numArray[i]) -> [2, 4, 6]
[2, 4, 6].sum() -> 12

Просто убедитесь, что start < stop и stop <= numArray.length и у вас не должно быть проблем.

  • 2
    Вы можете использовать Math.min(stop, numArray.length) в .range() чтобы избежать необходимости проверять этот stop <= numArray.length .
  • 1
    Конечно, это можно изменить. Хотя, как правило, методы, которые работают с массивами, возвращают ArrayIndexOutOfBoundsException, когда это необходимо. Часто вызывающая сторона отвечает за передачу правильных аргументов.
2
for (int i = start; (i < numArray.length) && (i <= stop); i++) {
    sum += numArray[i];
}
  • 0
    nitpick i<=array.length потенциально является ArrayOutOfBoundsException
  • 0
    @ gtgaxiola Верно, исправлено.
Показать ещё 7 комментариев
1

Вам нужен другой тип цикла, а не:

for (int i : numArray)

Лучшим подходом было бы:

int sum = 0;
if(stop <= array.length && start < stop) {
    for(int i = start; i < stop; i++) {
        sum += array[i];
    }
}
  • 1
    Здесь у него есть цикл for-each, поэтому вы можете добавить еще одну небольшую вещь: sum + = numArray [i]; а не sum + = i, что теперь не сработает, поскольку это индекс, а не значение. Что касается проверки границы, сделайте что-то вроде этого: if (numArray! = null && start> = 0 && start <numArray.length && stop <numArray.length & stop> = start), хотя вы, вероятно, должны проверить это еще до того, как начнете цикл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню