Как хранить данные в строковом массиве с использованием коллекции Java - PullRequest
0 голосов
/ 29 декабря 2018

Я сохранил данные в 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 голосов
/ 29 декабря 2018

Ваша переменная данных содержит список String [] (строковые массивы).Цикл for пытается сохранить их в значениях, представляющих собой одну строку [].

В зависимости от того, что вы пытаетесь сделать, вы можете сделать, как предлагают комментарии, и создать массив двухмерных строк.Однако тот факт, что вы хотите удалить их из совершенно хорошего списка строк [], заставляет меня поверить, что вы, вероятно, хотите, чтобы они были в одной большой строке [].

Ниже приведен пример того, как поместитьпервые N (в данном случае 5) слов, которые вы анализируете из csv в переменную 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]);
0 голосов
/ 29 декабря 2018
    // 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);
0 голосов
/ 29 декабря 2018

Заменить:

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}
0 голосов
/ 29 декабря 2018
  1. Списки индексируются 0, поэтому, если вы намеренно не хотите пропустить первый элемент, не начинайте итерацию цикла с 1, а с 0.
  2. Да, при выполнениипоследние println после цикла отображаются только данные, относящиеся к последним String[], потому что на каждой итерации вы обновляете values, то есть values = 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));
0 голосов
/ 29 декабря 2018

Я думаю, у вас есть небольшая ошибка внутри цикла 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

Я думаю, что вам не хватает «[i]» в первой строке цикла for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...