2014-01-19 73 views
1

我有一個文本文件中的值的列表,談到列表到索引數組

People.txt[ 
Name, ID, DOB, Sex 
Bill, 12, 12/12/1989, Male 
Cindy, 13, 12/11/1991, Female 
] 

我原本讀值轉換成字符串然後轉化串入的「」值的數組使用

List<String> items = Arrays.asList(str.split("\\s*,\\s*")); 

,但我想嘗試找到一種方法,可以創建包含標題對象,並將它們整理到列表或關聯數組與所有值的索引數組。

我是Java的新手,我無法弄清楚如何將值轉換爲標題數組。

+1

您的數據來自哪裏?它是CSV嗎?因爲那裏有一些開源的CSV閱讀器。 – mogosselin

+0

不,它只是一個.txt文件,我可以將它轉換爲CSV然後閱讀它,但我希望以更快/更骯髒的方式來做到這一點。 你能推薦一款開源閱讀器嗎? –

回答

1
String[] lines = str.split("\n"); 
String[] header = lines[0].split("\\s?,\\s?"); 

List<String[]> data = new ArrayList<String[]>(); 
for (int i=1; i<lines.length; i++) { 
    data.add(lines[i].split("\\s?,\\s?")); 
} 

沒有運行的代碼......但應該足以明白了吧:)

你需要指數data相同的方式,你指數header,因爲這是你似乎什麼請求例如您可以將其包裝在您自己的對象中:

class PeopleData implements Iterable<String[]> { 

    final String[] headers; 
    final List<String[]> data; 

    public PeopleData(final String str) { 
     String[] lines = str.split("\n"); 
     this.headers = lines[0].split("\\s?,\\s?"); 

     data = new ArrayList<String[] >(); 
     for (int i=1; i<lines.length; i++) { 
      data.add(lines[i].split("\\s?,\\s?")); 
     } 
    } 

    public int size() { 
     return headers.length; 
    } 

    public String[] getHeaders(int i) { 
     return headers; 
    } 

    public String getHeader(int i) { 
     return headers[i]; 
    } 

    public String[] getRow(int i) { 
     return data.get(i); 
    } 

    public String getData(int header, int i) { 
     final String[] row = getRow(i); 
     return row[header]; 
    } 

    public String getData(String header, int i) { 
     final int index = index(header); 
     if (index == -1) { 
      throw new IndexOutOfBoundsException("header '" + header + "' not found"); 
     } 
     return getData(index, i); 
    } 

    private int index(final String header) { 
     for (int i=0; i< headers.length; i++) { 
      if (header.equals(headers[i])) return i; 
     } 
     return -1; 
    } 

    @Override 
    public Iterator<String[]> iterator() { 
     return data.iterator(); 
    } 

} 
+1

'追加'方法來自哪裏? –

+1

@a_programmer應該是'加'抱歉 – kares

2

的數據結構,你需要保持這種關聯數組(地圖):

Map<String, List<String>> map; 
  1. 當你分割第一記錄您可以將其存儲在一個名爲headers
  2. 當你List<String>拆分下一記錄,然後使用插入此地圖:

    String[] vals = str.split("\\s*,\\s*"); 
    for (int i=0; i<vals.length; i++) { 
        List<String> cols = map.get(headers.get(i)); 
        if (cols == null) cols = new ArrayList<String>(); 
        cols.add(vals[i]); 
        map.put(headers.get(i), cols); 
    } 
    
+0

+1但是,我認爲foreach會更好 –

+0

實際上它需要索引值來獲取標題字符串。 – anubhava

+0

是地圖的標題部分還是我需要創建它們嗎? –