2013-05-29 85 views
2

我有這些數組的對象,其中存儲了我從文件中提取的信息。如何將這些變成一個數組,我認爲我的意思是使用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,collections和Open CSV。

+2

使用要打印的屬性創建一個類,爲每個對象設置屬性並將其添加到類類型的數組中。 – NINCOMPOOP

+1

那麼嚴格的老師!這是一個非常教學的練習來學習數組。 –

+0

是啊......即使我們的最後一項任務是這樣的,他對於每個對java感興趣的人都會失敗。 – roro

回答

0

一個二維數組肯定會工作,除了你需要知道你會有多少行。我假設列數是一致的。如果您無法知道文件中有多少行,那麼執行此操作的效率非常低但仍然有效的方法是循環整個文件一次,計算行數,創建一個2d數組許多行。然後每行保存這些信息。然後,要查找所需的信息,只需查看並檢查每行中的第一個點。

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; 
    } 

} 

很明顯,你將不得不增加更多的爲每個不同的領域,你可以有,但是這是基本的想法,並增加是複製和粘貼一樣簡單。

+0

我明白set/get方法,但是我將如何使用輸出的數據?我如何將它鏈接回我已創建的對象?多數民衆贊成在現在唯一覺得困惑我。 – roro

+0

只需製作大小爲n的YearlyInformation數組。運行一個for循環,大概只要你的文件有行,調用一個新的YearlyInformation構造函數,並將其存儲在適當的索引中。之後,您需要的所有信息都在YearlyInformation的數組中。從用戶那裏獲取他們的年份,然後再做一個循環(相同長度),並將用戶年份與getYear()的返回值進行比較。當它們匹配時,打印出所有數據 – Nealon

+0

您還需要爲該類實現ToString()方法,以使打印更容易。 – Nealon

0

如果你想存儲在二維陣列中的所有行,你可以使用類似的東西:

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; 

排序:雖然它可能

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

:如果你的老師不是一無所知java.util.Comparator說不是很有用的排序,因爲結構不允許快速搜索。

查詢:最後用戶輸入:

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


} 
+0

非常感謝你的幫助,瞭解了很多,只是讀了大聲笑 – roro

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),所以需要setter來代替。