【问题标题】:Turning a list into an indexed array将列表转换为索引数组
【发布时间】:2014-01-19 14:33:46
【问题描述】:

我有一个文本文件中的值列表,

 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 的新手,我不知道如何将值转换为带有标题的数组。

【问题讨论】:

  • 您的数据来自哪里?是 CSV 吗?因为那里有一些开源 CSV 阅读器。
  • 不,它只是一个 .txt 文件,我可以将其转换为 CSV 然后读取它,但我希望有一种更快/更脏的方法来做到这一点。你能推荐一个开源阅读器吗?

标签: java regex arrays object


【解决方案1】:

你需要保存这个关联数组(Map)的数据结构是:

Map<String, List<String>> map;
  1. 当您拆分第一条记录时,您可以将其存储在名为 headersList&lt;String&gt;
  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);
    }
    

【讨论】:

  • 其实它需要索引值来获取头部字符串。
  • 标题是地图的一部分还是我也需要创建它们?
  • map 中的每个键都类似于Name OR ID OR DOB 所以不需要单独存储headers
【解决方案2】:
 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?") );
 }

还没有运行代码......但应该足以得到这个想法:)

您需要以与索引header 相同的方式索引data,因为这似乎是您所要求的,例如您可以将其包装在您自己的对象中:

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

}

【讨论】:

  • 'append'方法从何而来?
  • @a_programmer 应该是 add 抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2021-08-28
  • 2014-02-04
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多