2

我有这些数组对象,其中存储了我从文件中提取的信息。如何将这些更改为数组,我想我打算使用二维数组,我想对它们进行排序并显示它们的相应信息。

while(kd.hasNext()){
        String data = kd.nextLine();
        String [] values = data.split(",");

        String wScore = "N/A" , lScore = "N/A", crowd = "N/A";

        String year = values[0];
        String premiers = values[1];
        String runnersUp = values[2];
        if (values.length > 6)
        {wScore= values[6];}
        if (values.length > 7)
        {lScore= values[7];}
        if (values.length > 8)
        {crowd= values[8];}

这是一个非常大的文件中的一行信息。

2005,Arsenal,ManU,Arsenal,WestHam,Y,2,3,40000

 So if the user enters: 
 2005 

我希望程序显示:

 Year: 2005
 Premiers: Arsenal
 Runner Up: ManU
 Minor Premier: Arsenal

ETC..

我尝试使用 for 循环来获取数组的长度,但由于我没有年份和数组中的所有其他对象,所以我不能使用它。我想知道是否有人对此有解决方案。

根据我的老师,我不允许使用 HashMap、ArrayList、集合和 Open CSV。

4

4 回答 4

1

如评论中所述,您将需要创建一个新类,可以任意命名,其中包含文本文件可能需要的尽可能多的字段。根据当年给出的数据量,为可能出现的不同情况制作几个不同的构造函数。从那里开始,只需为每个字段制作 get/set 方法。

基本框架:

public class YearlyInformation
{
    int years;
    string premier, runnersUp;

    public YearlyInformation(int year, string prem, string, runners)
    {
        years = year;
        premier = prem;
        runnersUp = runners;
    }

    int getYear(void)
    {
        return years;
    }

    void setYear(int year)
    {
        years = year;
    }

}

显然,您必须为每个可能拥有的不同字段添加更多内容,但这是基本想法,添加内容就像复制和粘贴一样简单。

于 2013-05-29T17:37:19.650 回答
0

如果要将所有行存储在 2D 数组中,可以使用类似的东西:

public static void main(String[] args) throws Exception {

    FileInputStream inputStream = new FileInputStream("file.txt");
    InputStreamReader streamReader =new InputStreamReader(inputStream,"UTF-8");
    BufferedReader in = new BufferedReader(streamReader);

    int increment = 10;
    int size = 0; // number of lines
    String[][] all = new String[increment][];

    for(String line; (line = in.readLine()) != null;) {

        String[] data = line.split(",");

        all[size++] = data;

        if(all.length == size) {
            // Increment capacity
            String[][] tmp = new String[all.length + increment][];
            for(int i = 0; i < data.length; i++) {
                tmp[i] = all[i];
            }
            all = tmp;
        }

    }

    // Trim to size
    String[][] tmp = new String[size][];
    for(int i = 0; i < size; i++) {
        tmp[i] = all[i];
    }
    all = tmp;

排序:如果你的老师没有说什么java.util.Comparator

    Arrays.sort(all, new Comparator<String[]>() {
        @Override
        public int compare(String[] a, String[] b) {
            // By year?
            int yearA = Integer.parseInt(a[0]);
            int yearB = Integer.parseInt(b[0]);
            return yearA - yearB;
        }
    });

虽然排序可能不是很有用,因为结构不允许快速搜索。

查询:最后是用户输入:

    String input = null;
    Scanner sc = new Scanner(System.in);
    do {
        System.out.print("Input the year: ");
        String year = sc.nextLine();
        for(int i = 0; i < size; i++) {
            if (all[i][0].equals(year)) {
                // out data
            }
        }

    } while (input == null || input.isEmpty());


}
于 2013-05-29T18:18:28.167 回答
0
  1. 创建一个新类来保存数据(在下面的示例中为 OneYearInfo)。您可以更新与文件中每个特定行相关的字段。
  2. 创建该类型对象的数组,其长度足以容纳所需的所有年份。例如,如果第一个可能的年份是 1900 年,最后一个可能的年份是 2013 年,则使用长度 114。完成此操作后,您可以将每个对象添加到数组中的相关位置 - 这样您就可以轻松地将其取回用户输入年份以显示:

    final int FIRST_YEAR = 1900;
    final int LAST_YEAR = 2013;
    OneYearInfo[] years = new OneYearInfo[LAST_YEAR - FIRST_YEAR + 1];
    int year = //get the info from file
    OneYearInfo newYear = new OneYearInfo();
       //set all the relevant fields of newYear
    years[year - FIRST_YEAR] = newYear;//adds newYear to your array
    

现在,当您的用户输入年份时,您只需要获取数组中的相关元素。因此,例如,2005 年应该是数组的第 106 个元素,即元素编号 105:

OneYearInfo yearToReturn = years[userEntry - FIRST_YEAR];
//Now get all valid fields from yearToReturn and display them for your user

您的类OneYearInfo可以为每个字段使用带有 getter/setter 的空构造函数,或者您可以为每个可能的字段组合使用自定义构造函数。如果只有几种可能性,最好使用多个构造函数,例如:

class OneYearInfo{
    private int year;
    private String premiers;
    //add all possible fields here

    //first constructor
    public OneYearInfo(int year, String premiers){
        this.year = year;
        this.premiers = premiers;
    }

    //second constructor
    public OneYearInfo(int year, String premiers, String minorPremiers){
        this.year = year;
        this.premiers = premiers;
        this.minorPremiers = minorPremiers;
    }

    //add more constructors

    //getters
    public int getYear(){
        return year;
    }
    //add more getters

    //you can add setters here if required

如果构造函数没有涵盖所有可能的情况,或者如果不可能对所有情况使用构造函数,例如某些情况的组合是相同类型的,例如 (int year, String Premiers) vs (int year, String minorPremiers)。这两种情况都是 (int,String) 所以需要设置器。

于 2013-05-29T18:21:46.183 回答
0

二维数组肯定会起作用,只是您需要知道您将拥有多少行。我假设列数是一致的。如果您无法知道文件中有多少行,那么一种效率极低但仍然有效的方法是遍历整个文件一次,计算行数,然后创建一个二维数组很多行。然后每一行都包含该信息。然后,要查找所需的信息,您只需查看并检查每行中的第一个位置。

于 2013-05-29T17:29:04.823 回答