Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从对象数组生成数组_Java_Arrays_Oop_Io - Fatal编程技术网

Java 如何从对象数组生成数组

Java 如何从对象数组生成数组,java,arrays,oop,io,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

我有这些数组对象,其中存储了我从文件中提取的信息。如何将它们转换成数组,我想我应该使用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
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
等等

我尝试使用for循环来表示数组的长度,但由于我没有数组中的年份和所有其他对象,所以我不能使用它。我想知道是否有人能解决这个问题


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

2D数组肯定可以工作,只是需要知道有多少行。我假设列的数量是一致的。如果您无法知道文件中有多少行,那么一种效率很低但仍然有效的方法是在整个文件中循环一次,计算行数,然后创建一个包含那么多行的二维数组。然后每一行都保存该信息。然后,为了找到所需的信息,您只需浏览并检查每行的第一个点。

如注释中所述,您需要创建一个新类,名为which your want,包含文本文件可能需要的尽可能多的字段。针对可能出现的不同情况,根据当年提供的数据量,创建两个不同的构造函数。从这里开始,只需为每个字段创建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;
    }

}

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

如果您想在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;
虽然排序可能不是很有用,但因为结构不允许快速搜索

查询:最后是用户输入:

    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());


}
字符串输入=null;
扫描仪sc=新的扫描仪(System.in);
做{
系统输出打印(“输入年份:”);
字符串year=sc.nextLine();
对于(int i=0;i
  • 创建一个新类来保存数据(下面的示例中是OneYearInfo)。您可以更新与文件中每个特定行相关的字段
  • 创建该类型对象的数组,其长度足以满足所有需要的年份。例如,如果第一个可能的年份是1900年,最后一个可能的年份是2013年,则使用长度114。完成此操作后,您可以将每个对象添加到阵列中的相关位置—这样,当用户在一年内键入要显示的内容时,您可以轻松地将其取回:

     Year: 2005
     Premiers: Arsenal
     Runner Up: ManU
     Minor Premier: Arsenal
    
    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年,字符串首字母)与(int年,字符串首字母)。这两种情况都是(int,String),因此需要设置器。

    创建一个具有要打印的属性的类,设置每个对象的属性,并将其添加到类类型的数组中。多么严格的老师!学习数组是一个非常有教育意义的练习。是的……即使我们上一次的作业是这样的,他也肯定会让所有对java感兴趣的人失望。我理解set/get方法,但我如何使用我拥有的数据进行输出?如何将其链接回已创建的对象?这是现在唯一让我困惑的想法。只需制作一个大小为n的年度信息数组。只要文件有行,就运行for循环,调用YearlyInformation的新构造函数,并将其存储在适当的索引中。在那之后,你需要的所有信息都在那一系列的年度信息中。从用户处获取年份,然后执行另一个for循环(相同长度),并将用户年份与getYear()的返回值进行比较。当它们匹配时,打印出所有的数据。您还需要为该类实现一个ToString()方法,以使打印更容易。好的,谢谢您,我想我明白了,我会玩一玩的!祝你好运,随时更新细节/更多问题非常感谢你的帮助,通过阅读lol学到了很多