我正在学习java,我有一个关于从文件中读取的问题 我想只读取包含字符串的文件中的数字。 这是我的文件的一个例子:
66.56
"3
JAVA
3-43
5-42
2.1
1
这是我的编码: 公共课堂考试{
public static void main (String [] args){
if (0 < args.length) {
File x = new File(args[0]);
try{
Scanner in = new Scanner( new FileInputStream(x));
ArrayList<Double> test = new ArrayList<>();
while(in.hasNext()){
if(in.hasNextDouble()){
Double f=in.nextDouble();
test.add(f);}
else
{in.next();}
}
catch(IOException e) { System.err.println("Exception during reading: " + e); }
}
我的问题是它只添加66.56,2.1和1 它不会在“3之后添加3或它忽略3-43和5-42 你能告诉我如何跳过弦乐,只在这里添加双打吗? 感谢
答案 0 :(得分:0)
所有上述三个即; “3,3-43和4-42是字符串
要么你读一个字符串并将其拆分并检查“和 - 中的数字,或者你在字符和整数之间放置一个空格。 编译后的JVM如果无法将其转换为double,则将其全部视为字符串。 文件阅读器不会停止阅读,直到至少一个空格或换行符。 因此,除非你像我上面所说的那样,否则你的代码永远不会以你想要的方式工作。
解决方案1:
将输入文件更改为以下内容:
66.56
" 3
JAVA
3 - 43
5 - 42
2.1
1
解决方案2:
考虑到输入文件的高度可变性,我发布的解决方案仅针对您当前的输入。如果输入改变,则需要实现更通用的算法。
public static void main(String[] args) {
File x = new File(args[0]);
try {
Scanner in = new Scanner(new FileInputStream(x));
ArrayList<Double> test = new ArrayList<>();
while (in.hasNext()) {
if (in.hasNextDouble()) {
Double f = in.nextDouble();
test.add(f);
} else {
String s=in.next();
if(s.contains("\"")){
String splits[]=s.split("\"");
test.add(Double.parseDouble(splits[1]));
}
else if (s.contains("-")){
String splits[]=s.split("-");
test.add(Double.parseDouble(splits[0]));
test.add(Double.parseDouble(splits[1]));
}
}
}
System.out.println(test);
} catch (IOException e) {
System.err.println("Exception during reading: " + e);
}
}
答案 1 :(得分:0)
您可以编写自定义Type Sensor Utility类来检查对象是否可以转换为Integer。我会像这样处理这个问题。
此外,我可以看到你有像 2.1 和“3 这样的值来处理这些场景,编写其他方法,例如 isDoubleType()或< strong> isLongType()等
此外,您需要编写一些自定义逻辑来解决此问题。
public class TypeSensor {
public String inferType(String value) throws NullValueException {
int formatIndex = -1;
if (null == value) {
throw new NullValueException("Value provided for type inference was null");
}else if (this.isIntegerType(value)) {
return "Integer";
}else{
LOGGER.info("Value " + value + " doesnt fit to any predefined types. Defaulting to String.");
return "String";
}
}
}
private boolean isIntegerType(String value) {
boolean isParseable = false;
try {
Integer.parseInt(value);
LOGGER.info("Parsing successful for " + value + " to Integer.");
isParseable = true;
} catch (NumberFormatException e) {
LOGGER.error("Value " + value + " doesn't seem to be of type Integer. This is not fatal. Exception message is->"
+ e.getMessage());
}
return isParseable;
}
}