从文本文件中获取对象

时间:2014-11-12 11:26:55

标签: java

我有一个这样的文本文件;

    7-Georgia
    1-Andrew
    6-John
    8-Luke
    9-Erica
    3-Kim
    2-Jude
    5-Phil
    4-Leo

第一列是id,第二列是name。我怎样才能获得这些身份证和姓名?到目前为止我写了这个;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
public class Main {

    @SuppressWarnings("resource")
    public static void main(String[] args) throws FileNotFoundException {
        // TODO Auto-generated method stub
        @SuppressWarnings("unused")

        Scanner fromFile = new Scanner(new File("id_name.txt"));
        fromFile.useDelimiter("-");

        while(fromFile.hasNext()){
            String temp = fromFile.next();
            System.out.println(temp);
        }

        while(fromFile.hasNext()){
            String temp= fromFile.next();
            int[] fileID;
            fileID= new int[9];

            for(int i=0; i<9; i++){
                fileID[i]= Integer.parseInt(temp);
            }

            System.out.println(fileID);
        }
    }
}

但这并没有得到身份证明。我不确定如何解决这个问题,如果你帮助我,我将不胜感激。

4 个答案:

答案 0 :(得分:2)

您的代码中有两个while循环。通常,一个while循环将遍历每个项目,直到条件不再为真。我认为你需要重新设计这个以获得更好的“控制流”,这可能意味着只使用一个while循环(使用部分来获取数字,然后是名称。

我想你正在寻找第二个while循环的结果,但是当你到达它时,第一个while循环将耗尽所有数据。

最后,打印数组将打印出数组引用标识符。如果要实际打印数组的内容,则需要在数组中的元素上进行循环,并且需要显式打印出每个数组元素。

作为上述阵列打印技术(您应该掌握)的替代方法,您还可以使用Arrays.toString(<insert array here>)方法调用。但是,在许多情况下,它会为您提供不需要的格式。这就是你需要了解上述技术的原因。

此外,您还有一个隐藏的问题。你(在第二个while循环中)假设只有九个输入。密切关注你在写什么。每次你必须找到一个数字,考虑它是否是一个“魔术”数字。幻数是代码中的数字,没有任何解释或原因。它们是代码中的错误指标,这些错误可能不会经过时间的考验。

例如,您使用的是数字9,因为您已看到输入文件。下一个输入文件中可能没有九个条目,如果您为其输入了八个条目,或者一个输入有十个条目,您的程序可能无法正常工作。也许你应该通过在仍有(某些)输入时进行逻辑处理来重写循环来删除幻数。

答案 1 :(得分:0)

尝试使用尺寸

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try {
            Scanner fromFile = new Scanner(new File("id_name.txt"));
        } catch (FileNotFoundException e) {
            System.err.println("File not found");
        }

        String[] arr = new String[9];
        String[] oth = new String[9];
        int i = 0;

        while(fromFile.hasNextLine()) {
            String temp = fromFile.nextLine();
            oth[i] = temp.substring(0,1);
            arr[i] = temp.substring(2);
            i++;
        }

        int[] fileID;
        fileID = new int[9];

        for(int j = 0; j < 9; j++) {
            fileID[j] = Integer.parseInt(oth[j]);
        }
    }
}

这应该通过并检索数字(.substring(0,1))然后检索名称(.substring(2)),然后将数字转换为int值。

答案 2 :(得分:0)

尝试以下方法:

File file=new File("id_name.txt");
int[] fileID;
fileID= new int[9];
String[] result = file.nextLine().split("-");

for (int x = 0; x < result.length; x++){
if (Character.isDigit(result[x])) { // use the isDigit method to get the ids
System.out.println("this is an id");
fileID[i]= Integer.parseInt(result[x]);
}

答案 3 :(得分:0)

其实我的朋友,这里有几个错误。

1)当第一个while循环完成时,它将fromfile.hasNext()保留为false因此第二个循环永远不会启动。

&gt;&gt; 要解决此问题,您需要将其全部放在一个循环中。

2)fileID是一个数组。您无法使用System.out.println(fileID)打印它。

&gt;&gt; 您必须告诉您想要什么样的输出。代码将取决于此。要简单地打印所有值,您需要创建 for 循环,以分别打印每个值。您应该使用fileID.length作为号码。你需要循环它的次数。

3)基本上,fromfile.next()不是这样做的。

&gt;&gt; 您需要使用fromfile.nextLine()