我习惯了python,所以这对我来说有点混乱。我试图逐行接收输入,直到用户输入一定数量。数字将存储在一个数组中,以便为它们应用一些统计数学。目前,我有一个主类,统计类和一个“阅读”类。
两个问题:
我似乎无法让输入循环解决,这样做的最佳做法是什么。
阅读方法的对象类型是什么? double [],还是ArrayList?
如何将方法类型声明为arraylist?
如何防止阵列中存储超过1000个值?
让我展示一下到目前为止:
public static java.util.ArrayList readRange(double end_signal){
//read in the range and stop at end_signal
ArrayList input = new ArrayList();
Scanner kbd = new Scanner( System.in );
int count = 0;
do{
input.add(kbd.nextDouble());
System.out.println(input); //debugging
++count;
} while(input(--count) != end_signal);
return input;
}
任何帮助都会受到赞赏,原谅我的新手......
答案 0 :(得分:5)
您在循环条件中需要的是:
while ( input.get( input.size()-1 ) != end_signal );
你正在做的是递减计数器变量。
另外你应该如此声明ArrayList
:
ArrayList<Double> list = new ArrayList<Double>();
这使列表特定于类型,并允许条件给定。否则会有额外的施法。
答案 1 :(得分:2)
数目:
→1。我似乎无法让输入循环得以解决,这样做的最佳做法是什么。
我宁愿有一个简单的while循环而不是do {} while ...并将条件放在while ...在我的例子中它读取:
虽然读取的数字不是结束信号且计数低于限制:执行。
大于2。读取方法的对象类型是什么? double []或ArrayList?
ArrayList,但我强烈建议您使用List(java.util.List)接口。编程到接口而不是实现是一个很好的OO实践。
&gt; 2.1如何将method-type声明为arraylist?
见下面的代码。
&GT; 2.2。如何防止阵列中存储的值超过1000?
在while条件中添加此限制。
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
public class InputTest{
private int INPUT_LIMIT = 10000;
public static void main( String [] args ) {
InputTest test = new InputTest();
System.out.println("Start typing numbers...");
List list = test.readRange( 2.0 );
System.out.println("The input was " + list );
}
/**
* Read from the standar input until endSignal number is typed.
* Also limits the amount of entered numbers to 10000;
* @return a list with the numbers.
*/
public List readRange( double endSignal ) {
List<Double> input = new ArrayList<Double>();
Scanner kdb = new Scanner( System.in );
int count = 0;
double number = 0;
while( ( number = kdb.nextDouble() ) != endSignal && count < INPUT_LIMIT ){
System.out.println( number );
input.add( number );
}
return input;
}
}
最后的评论:
最好使用“实例方法”而不是类方法。这种方式如果需要,“readRange”可以由子类处理而不必更改签名,因此在示例中我删除了“static”关键字,创建了一个“InputTest”类的实例
在java代码样式中,变量名称应该在cammel的情况下,如“endSignal”而不是“end_signal”
答案 2 :(得分:0)
**
public static java.util.ArrayList readRange(double end_signal) {
//read in the range and stop at end_signal
ArrayList input = new ArrayList();
Scanner kbd = new Scanner(System. in );
int count = 0;
do {
input.add(Double.valueOf(kbd.next()));
System.out.println(input); //debugging
++count;
} while (input(--count) != end_signal);
return input;
}
**
答案 3 :(得分:0)
我认为你开始并不差,但这是我的建议。我将重点介绍代码下方的重要差异和要点:
包控制台;
import java.util。; import java.util.regex。;
public class ArrayListInput {
public ArrayListInput() {
// as list
List<Double> readRange = readRange(1.5);
System.out.println(readRange);
// converted to an array
Double[] asArray = readRange.toArray(new Double[] {});
System.out.println(Arrays.toString(asArray));
}
public static List<Double> readRange(double endWith) {
String endSignal = String.valueOf(endWith);
List<Double> result = new ArrayList<Double>();
Scanner input = new Scanner(System.in);
String next;
while (!(next = input.next().trim()).equals(endSignal)) {
if (isDouble(next)) {
Double doubleValue = Double.valueOf(next);
result.add(doubleValue);
System.out.println("> Input valid: " + doubleValue);
} else {
System.err.println("> Input invalid! Try again");
}
}
// result.add(endWith); // uncomment, if last input should be in the result
return result;
}
public static boolean isDouble(String in) {
return Pattern.matches(fpRegex, in);
}
public static void main(String[] args) {
new ArrayListInput();
}
private static final String Digits = "(\\p{Digit}+)";
private static final String HexDigits = "(\\p{XDigit}+)";
// an exponent is 'e' or 'E' followed by an optionally
// signed decimal integer.
private static final String Exp = "[eE][+-]?" + Digits;
private static final String fpRegex = ("[\\x00-\\x20]*" + // Optional leading "whitespace"
"[+-]?(" + // Optional sign character
"NaN|" + // "NaN" string
"Infinity|" + // "Infinity" string
// A decimal floating-point string representing a finite positive
// number without a leading sign has at most five basic pieces:
// Digits . Digits ExponentPart FloatTypeSuffix
//
// Since this method allows integer-only strings as input
// in addition to strings of floating-point literals, the
// two sub-patterns below are simplifications of the grammar
// productions from the Java Language Specification, 2nd
// edition, section 3.10.2.
// Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
"(((" + Digits + "(\\.)?(" + Digits + "?)(" + Exp + ")?)|" +
// . Digits ExponentPart_opt FloatTypeSuffix_opt
"(\\.(" + Digits + ")(" + Exp + ")?)|" +
// Hexadecimal strings
"((" +
// 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
"(0[xX]" + HexDigits + "(\\.)?)|" +
// 0[xX] HexDigits_opt . HexDigits BinaryExponent
// FloatTypeSuffix_opt
"(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +
")[pP][+-]?" + Digits + "))" + "[fFdD]?))" + "[\\x00-\\x20]*");// Optional
// trailing
// "whitespace"
}
在Java中,使用泛型是一件好事。这样,您就可以为编译器和虚拟机提供有关要使用的类型的提示。在这种情况下,它是double并通过声明结果List包含double值, 您可以在不进行强制转换/类型转换的情况下使用这些值:
if (!readRange.isEmpty()) {
double last = readRange.get(readRange.size() - 1);
}
最好在使用Java集合时返回Interfaces,因为有许多特定列表的实现(LinkedList,SynchronizedLists,...)。因此,如果您稍后需要其他类型的List,则可以轻松更改方法中的具体实现,而无需更改任何其他代码。
您可能想知道为什么while控制语句有效,但如您所见, next = input.next()。trim()周围有括号。这样,变量赋值就在条件测试之前发生。此外,修剪需要玩法以避免空白问题
我这里没有使用 nextDouble(),因为每当用户输入不是双精度的东西时,你就会得到异常。通过使用String,我能够解析用户提供的任何输入,但也可以测试结束信号。
可以肯定的是,用户确实输入了一个double,我使用了 Double.valueOf()方法的JavaDoc中的正则表达式。如果此表达式匹配,则转换该值,否则将打印错误消息。
您使用了一个计数器,原因是我在您的代码中没有看到。如果您想知道已成功输入了多少个值,只需调用 readRange.size()。
如果您想处理数组,构造函数的第二部分将展示如何转换它。
我希望你不要混淆我混合双倍和双倍,但感谢Java 1.5功能Auto-Boxing这没问题。由于 Scanner.next()永远不会返回null(afaik),这应该不是问题。
如果要限制数组的大小,请使用
好的,我希望您发现我的解决方案和解释很有用,使用 result.size()作为指标,关键字中断以保留while控制语句。
Greetz,GHad
答案 4 :(得分:0)
public static ArrayList<Double> readRange(double end_signal) {
ArrayList<Double> input = new ArrayList<Double>();
Scanner kbd = new Scanner( System.in );
int count = 0;
do{
input.add(kbd.nextDouble());
++count;
} while(input(--count) != end_signal);
return input;
}