将列表转换为索引数组

时间:2014-01-19 14:33:47

标签: java regex arrays object

我在文本文件中有一个值列表

 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的新手,我无法弄清楚如何将值转换为带标题的数组。

2 个答案:

答案 0 :(得分:2)

保存此关联数组(Map)所需的数据结构是:

Map<String, List<String>> map;
  1. 分割第一条记录时,您可以将其存储在名为List<String>
  2. headers
  3. 分割下一条记录时,请使用以下方法插入此地图:

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

答案 1 :(得分: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();
    }

}