问题描述
我已经为此苦了一段时间了。 我知道我可以在构造函数中将String实例化为ArrayList,但是我不知道如何从跑步者实例化一组int到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。
1楼
在构造函数中,您可以使用空格对单词进行分割,然后将每个标记转换为整数,最后收集到列表中:
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。
2楼
如果不愿意使用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
传递将需要更精细的解析。
3楼
- 您可以使用replaceAll方法和regexp或??删除所有空格。
- 然后,您可以遍历字符串char并尝试将其解析为number。
- 之后,只需将其添加到数字列表中即可。
但是,您需要考虑如果数字多于1位会发生什么情况