如何从文本文件中读取和添加数字到数组

时间:2013-10-06 13:31:11

标签: arrays java.util.scanner

我正在学习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 你能告诉我如何跳过弦乐,只在这里添加双打吗? 感谢

2 个答案:

答案 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;
    }
}