Java 如何从对象数组生成数组
我有这些数组对象,其中存储了我从文件中提取的信息。如何将它们转换成数组,我想我应该使用2D数组,我想对它们进行排序并显示它们的相应信息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
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
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
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学到了很多