2014-01-19 3 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

Откуда берутся методы 'append'? –

+1

@a_programmer должен был «добавить» извините – kares

2

Структура данных вы должны будете держать этот ассоциативный массив (Карта) является:

Map<String, List<String>> map; 
  1. При разделении первой записи вы можете хранить его в List<String> называется headers
  2. Когда ты разделите следующие записи, затем вставьте в эту карту, используя:

    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

является заголовком части Карты или мне тоже нужно создать их? –

Смежные вопросы