如何使用Java集合将数据存储在字符串数组中

时间:2018-12-28 21:16:04

标签: java arrays list guava

我已经将数据存储在List<String[]>中,并且需要使用循环将这些数据存储到另一个String数组中。我创建了一个String数组(value)并将数据存储在其中,但问题是循环内的第一个元素被第二个元素替换,并且在循环结束时仅显示最后一个元素。

CSVReader reader = new CSVReader(new FileReader(csvfile));
List<String[]> data = reader.readAll();
String[] values = new String[5];
for (int i = 1; i < 5; i++) {
    values = data.get(i);
    System.out.println(values[1]); // data is getting replaced here
}
System.out.println(values[1]); // this will show only the last stored value

5 个答案:

答案 0 :(得分:1)

  1. 列表被0索引,因此除非您有意跳过第一个元素,否则不要在1而不是0处开始循环迭代。
  2. 是的,在执行循环后的最后一个println时,仅显示与最后一个String[]相关的数据,因为在每次迭代中,您都将valuesvalues = data.get(i);更新为存储当前String[],因此存储上述结果。
  3. 您可能想要一个String[][]而不是String[],因为每个String[]代表文件的一行。

因此,假设您只想从data中获取前五行,则可以这样操作:

String[][] lines = data.subList(0, 5).toArray(String[][]::new);

或所有行均显示为:

String[][] lines = reader.readAll().toArray(String[][]::new);

,您可以使用以下命令进行测试:

System.out.println(Arrays.deepToString(lines));

答案 1 :(得分:1)

    // generating data
    List<String[]> data =
            Stream.iterate(0,  n -> n + 1)
                    .limit(10)
                    .map(i -> new String[]{"a" + i, "b" + i, "c" + i, "d" + i, "e" + i, "f" + i})
                    .collect(Collectors.toList());

    String[][] values = new String[data.size()][];

    // copy the data
    for (int i = 0; i < data.size(); i++)
    {
        values[i] = data.get(i).clone();
    }

    //print the result
    Arrays.stream(values).map(Arrays::toString).forEach(System.out::println);

答案 2 :(得分:0)

我认为您在for循环中有一个小错误。试试这个:

CSVReader reader = new CSVReader(new FileReader(csvfile));
List<String[]> data = reader.readAll();
String[] values = new String[5];
for (int i = 1; i < 5; i++) {
    values[i] = data.get(i);
    System.out.println(values[1]); // data is getting replaced here
}
System.out.println(values[1]); // this will show only the last stored value

我认为您在for循环的第一行中缺少“ [i]”。

答案 3 :(得分:0)

替换:

for (int i = 1; i < 5; i++) {
values = data.get(i);
System.out.println(values[1]); // data is getting replaced here}

使用:

for (int i = 0; i < 5; i++) {
values = data.get(i);
System.out.println(values[1]); // data is getting replaced here}

答案 4 :(得分:0)

您的数据变量包含String [](字符串数组)的列表。您的for循环正在尝试将它们存储在单个String []的值中。

根据您要执行的操作,可以按照注释的建议进行操作,并创建2D String数组。但是,您实际上希望从一个非常好的String []列表中删除它们,这使我相信您可能希望将它们放在一个大String []中。

以下是如何将您从csv解析的前N个(在本例中为5个)单词放入values变量的示例。但是,如果您提供了代码段的最终用例,我们将能够为您提供更好的指导。

    // initialize test data
    List<String[]> data = new ArrayList<String[]>();
    String[] a = {"a1", "a2"};
    String[] b = {"b1", "b2"};
    String[] c = {"c1", "c2"};
    data.add(a);
    data.add(b);
    data.add(c);

    // big N is how many words you want
    int N = 5;
    // little n tracks how many words have been collected
    int n = 0;
    String[] values = new String[N];
    // loop through csv collect
    for (int i = 0; i < data.size(); i++){
        String[] cur = data.get(i);
        // loop through the strings in each list entry
        for (int j = 0; j < cur.length; j++){
            // store value and increment counter
            values[n] = cur[j];
            n++;
            // stop if maximum words have been reached
            if (n >= N)
                break;
        }
        // stop if maximum words have been reached
        if (n >= N)
                break;
    }

    for (int i = 0; i < values.length; i++)
        System.out.println(values[i]);