Как мне установить этот список чисел в моем бегуне в ArrayList в конструкторе?

Я уже некоторое время борюсь с этим. Я знаю, что могу создать экземпляр String для ArrayList в конструкции, но я не знаю, как мне создать экземпляр группы целых чисел для ArrayList из бегуна, не делая все это вручную, используя list.add(number) снова и снова .

void setup() { //My runner
  NumAnalyzer test = new NumAnalyzer("5 12 9 6 1 4 8 6");

  out.println("even count = "+test.countEvens());
  out.println("odd count = "+test.countOdds());
  out.println("perfect count = "+test.countPerfects()+"\n\n\n");


  //add more test cases
}




import java.util.ArrayList;    
import java.util.Scanner;
import static java.lang.System.*;

public class NumAnalyzer{
  private ArrayList<Number> list;

  public NumAnalyzer(String word){
    list = new ArrayList<Number>(); //This instantiates it as a String but I want it to instantiate it as a list of integers. 
  }


  public int countOdds(){ //counting odds
      int oddCount=0;
      for(int x=0; x<list.size(); x++){
        if (list.get(x)%2 != 0){
          oddCount++;
        }
      }
      return oddCount;
  }

  public int countEvens(){ //counting evens
      int evenCount=0;
     for(Number num : list){
        if (list.get(num)%2 == 0){
           evenCount++;
        }
      }
      return evenCount;
  }

  public int countPerfects() {
     int perfectCount=0;
     for(int x=0; x<list.size(); x++){

       int mult=2, factorsum=0; //gets the sum of the multiples
       while(list.get(x) != mult){
         if (list.get(x)%mult == 0){
           factorsum=factorsum+list.get(x);
         }
         mult++;
       }

       if (factorsum == list.get(x)){ //testing to see if it's perfect
         perfectCount++;
       }
     }
     return perfectCount;
  }

  public String toString( ){





    return "Number of Odds:"+oddCount+"/n Number of Evens:"+evenCount+"/n Number of Perfects:"+perfectCount+list;
  }
}

В целом я просто хочу, чтобы конструктор создавал экземпляр ArrayList с числами из бегуна.

Вы должны начать с ваших чисел в строке? Не могли бы вы начать с них как последовательность чисел, например. test = new NumAnalyzer(5, 12, 9, 6, 1, 4, 8, 6);?

dave 14.02.2019 01:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
145
3

Ответы 3

В своем конструкторе вы можете разделить слово с помощью пробелов, а затем преобразовать каждый токен в целое число и, наконец, собрать в список: -

list = Arrays.stream(word.split("\\s+"))
        .map(Integer::parseInt)
        .collect(Collectors.toList());

Обновлять

Для чисел вместо целых чисел вы можете использовать это сопоставление: -

.map(s -> s.contains(".") ? (Number) Double.parseDouble(s) : Integer.parseInt(s))

Если вы строго хотите ArrayList, а не любой список, вы можете собрать его как: -

.collect(Collectors.toCollection(ArrayList::new));

Но лучше использовать varargs, если вы не работаете со строками.

Стоит отметить, что этот пример потребует изменения ссылочного типа с ArrayList->List и будет работать только для Integers (хотя в OP есть тип Number).

J-Alex 14.02.2019 01:59

@J-Alex OP должен использовать List вместо ArrayList - код для интерфейса, а не для класса. Я согласен с вами в отношении чисел, я обновил ответ, спасибо.

Kartik 14.02.2019 02:34
  1. Вы можете удалить все пробелы, используя метод replaceAll и регулярное выражение или „ „.
  2. Затем вы можете перебрать строковые символы и попытаться разобрать их на числа.
  3. После этого просто добавьте его в список номеров.

Однако вам необходимо учитывать, что произойдет, если число имеет более 1 цифры.

Вот почему метод @Kartik лучший. Он будет работать для стольких номеров, сколько пожелает пользователь.

BMasonJ13 14.02.2019 01:49

Конечно, вы правы :) Но вопрос в том, понимает ли Тоби стримы :)

Tom 14.02.2019 01:53

Зачем вам конструктор с String, если вы не хотите его использовать?

Сюда хорошо впишется конструктор Varargs:

class NumAnalyzer {
    private List<Number> list;

    public NumAnalyzer(Number... numbers) {
        list = Arrays.asList(numbers);
    }
}

void setup() {
    NumAnalyzer test = new NumAnalyzer(5, 12, 9, 6, 1, 4, 8, 6);
}

Обратите внимание, что гораздо лучше использовать private List<Number> list вместо private ArrayList<Number> list.

Более того, этот код не скомпилируется, потому что вы обрабатываете Numbers как Integers. Если вы действительно ожидаете число любого типа, передача их в виде String потребует более детального анализа.

Другие вопросы по теме