如何从对象数组中创建数组

时间:2013-05-29 17:20:36

标签: java arrays oop io

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

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

等。

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

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

4 个答案:

答案 0 :(得分: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;
    }

}

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

答案 1 :(得分:0)

一个2D数组肯定会起作用,除了你需要知道你将拥有多少行。我假设列数是一致的。如果你没有办法知道文件中有多少行,那么执行此操作的效率非常低但仍然有效的方法是循环遍历整个文件一次,计算行数,创建一个带有该行的二维数组很多行。然后每行保存该信息。然后,为了找到所需的信息,您只需查看并检查每行中的第一个位置。

答案 2 :(得分: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());


}

答案 3 :(得分: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
    
  3. 现在,当您的用户输入一年时,您只需要获取阵列中的相关元素即可。因此,例如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),因此需要使用setter。