(Как) я могу сделать этот код массива выглядеть лучше? (Codingbat - Array-1 sum2) - PullRequest
0 голосов
/ 29 января 2020

Я новичок в этом форуме и в программировании, и у меня есть мой первый вопрос:)

Цель - вернуть сумму первых двух целых чисел в массиве. Мое решение на картинке, которую я добавил. Есть ли способ решить это с меньшим количеством случаев? (Я знаю, что я не должен был делать для l oop, но я только выучил это и хотел попробовать: D)

Спасибо за все ответы!

https://i.stack.imgur.com/hx06s.png

Редактировать: Вот мой код:

public int sum2(int[] nums) {

  int sum = 0;

  if(nums.length == 0){
    return sum;
  }

  if(nums.length == 1){
    return nums[0];
  }
  for(int i = 0; i < 2; i++){
    sum += nums[i];
  }
  return sum;
}

Ответы [ 7 ]

3 голосов
/ 15 февраля 2020

вы можете использовать метод limit () в потоке

 public long sum2(int[] nums) {
      return Arrays.stream(nums).limit(2).sum();
   }
2 голосов
/ 29 января 2020

Вы можете обработать это простым способом:

public int sum2(int[] nums) {

    if (nums.length == 0)
        return 0;

    if (nums.length == 1)
        return nums[0];

    return nums[0] + nums[1];
}

Вы не можете удалить два оператора if из кода, если не хотите излишне усложнять это, например, как @axurefrog написал в своем комментарии:

public int sum2(int[] nums) {

    int sum = 0;

    for (int i = 0; i < nums.length && i < 2; i++)
        sum += nums[i]; 

    return sum;
}
0 голосов
/ 08 февраля 2020

Если вы используете Java8 или выше и хотите иметь более общее c решение (то есть сумму N чисел), вы можете использовать потоки следующим образом:

public long sum2(int[] nums) {
    return Arrays.stream(nums).sum();
}
0 голосов
/ 30 января 2020

Вот два альтернативных решения, которые несколько выглядят «лучше»:

  • sum2() с switch, поэтому нет, если операторы
  • sum3() с nested ternary выражениями делает его очень коротким.

Рекомендуется избегать множественных return, чтобы вы могли сохранить единственную запись - простую точку выхода алгоритма, поддержка отладки.

Я оставил фрагмент обернутым, чтобы вы могли попробовать его с помощью одной копии / вставки.

public class Main{

    public static int sum2(int[] nums) {

        int sum = 0;

        switch (nums.length) {
            case 0:
                break;
            case 1:
                sum = nums[0];
                break;
            default:
                sum = nums[0] + nums[1];
                break;
        }

        return sum;
    }


    public static int sum3(int[] nums) {

        return nums.length == 1 ? nums[0] : nums.length >= 2 ? nums[0] + nums[1] : 0;
    }


    public static void main(String []args){

        int[] nums1 = {11, 13, 1, 0};   // expected: 24
        int[] nums2 = {3};              // expected: 3
        int[] nums3 = {};               // expected: 0

        System.out.println("sum2: " + sum2(nums1));
        System.out.println("sum2: " + sum2(nums2));
        System.out.println("sum2: " + sum2(nums3));
        System.out.println(' ');
        System.out.println("sum3: " + sum3(nums1));
        System.out.println("sum3: " + sum3(nums2));
        System.out.println("sum3: " + sum3(nums3));

    }
}

Вывод:

sum2: 24                                                                                                                                   
sum2: 3                                                                                                                                    
sum2: 0                                                                                                                                    

sum3: 24                                                                                                                                   
sum3: 3                                                                                                                                    
sum3: 0                                                                                                                                    
0 голосов
/ 29 января 2020

Вы можете сделать это следующим образом:

public int sum2(int[] nums) {
    int sum = 0;
    if (nums != null) {
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
    }
    return sum;
}

Тест:

public class Main {
    public static void main(String[] args) {
        // Tests
        int[] a = { 10, 20, 30 };
        System.out.println(sum2(a));

        int[] b = { 10, 20 };
        System.out.println(sum2(b));

        int[] c = { 10 };
        System.out.println(sum2(c));

        int[] d = {};
        System.out.println(sum2(d));

        int[] e = null;
        System.out.println(sum2(e));
    }

    static int sum2(int[] nums) {
        int sum = 0;
        if (nums != null) {
            for (int i = 0; i < nums.length; i++) {
                sum += nums[i];
            }
        }
        return sum;
    }
}

Выход:

60
30
10
0
0
0 голосов
/ 29 января 2020

Возвращает сумму первого n значения массива:

public int sum(int[] arr, int n) {
    int sum  = 0;
    int num = Math.min( arr.length, n );
    for( int i=0; i < num; i++ ) {)
        sum += arr[i];
    }
    return sum;
}
0 голосов
/ 29 января 2020

Вы можете просто сделать это без головной боли if-else

public int sum2(int[] nums)                                                     
{
    int sum = 0;
    for(int i = 0; i < nums.length && i < 2; i++) sum+=nums[i];
    return sum;
}

Редактировать: добавив i < nums.length в условие l oop, чтобы позаботиться о пустом массиве согласно комментарию от Luca Murra

...