Я уже некоторое время борюсь с этим. Я знаю, что могу создать экземпляр 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 с числами из бегуна.




В своем конструкторе вы можете разделить слово с помощью пробелов, а затем преобразовать каждый токен в целое число и, наконец, собрать в список: -
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 OP должен использовать List вместо ArrayList - код для интерфейса, а не для класса. Я согласен с вами в отношении чисел, я обновил ответ, спасибо.
Однако вам необходимо учитывать, что произойдет, если число имеет более 1 цифры.
Вот почему метод @Kartik лучший. Он будет работать для стольких номеров, сколько пожелает пользователь.
Конечно, вы правы :) Но вопрос в том, понимает ли Тоби стримы :)
Зачем вам конструктор с 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 потребует более детального анализа.
Вы должны начать с ваших чисел в строке? Не могли бы вы начать с них как последовательность чисел, например.
test = new NumAnalyzer(5, 12, 9, 6, 1, 4, 8, 6);?