Как перенести List ?

В Linux и Unix вообще "r" и "rb" одинаковы. Более конкретно, указатель FILE, полученный fopen() в файле в текстовом режиме и в двоичном режиме, ведет себя одинаково в Unix. В окнах и вообще в системах, которые используют более одного символа для представления « newlines », файл, открытый в текстовом режиме, ведет себя так, как если бы все эти символы были всего одним символом, '\n'.

Если вы хотите портативно читать / записывать текстовые файлы в любой системе, используйте "r" и "w" в fopen(). Это гарантирует, что файлы будут записаны и прочитаны правильно. Если вы открываете двоичный файл, используйте "rb" и "wb", так что неудачный перевод новой строки не испортит ваши данные.

Обратите внимание, что следствие базовой системы, выполняющей перевод новой строки потому что вы не можете определить количество байтов, которое вы можете прочитать из файла, используя fseek (файл, 0, SEEK_END) .

Наконец, см. Что разница между текстом и двоичным вводом / выводом в comp.lang.c Часто задаваемые вопросы .

13
задан om-nom-nom 13 March 2013 в 20:52
поделиться

9 ответов

Это называется транспонированием. Следующий фрагмент делает то, что вам нужно:

import java.util.*;
public class ListTranspose {
    public static void main(String[] args) {
        Object[][] data = {
            { "Title", "Data1", "Data2", "Data3" },
            { "A", 2, 3, 4 },
            { "B", 3, 5, 7 },
        };
        List<List<Object>> table = new ArrayList<List<Object>>();
        for (Object[] row : data) {
            table.add(Arrays.asList(row));
        }
        System.out.println(table); //  [[Title, Data1, Data2, Data3],
                                   //   [A, 2, 3, 4],
                                   //   [B, 3, 5, 7]]"
        table = transpose(table);
        System.out.println(table); //  [[Title, A, B],
                                   //   [Data1, 2, 3],
                                   //   [Data2, 3, 5],
                                   //   [Data3, 4, 7]]
    }
    static <T> List<List<T>> transpose(List<List<T>> table) {
        List<List<T>> ret = new ArrayList<List<T>>();
        final int N = table.get(0).size();
        for (int i = 0; i < N; i++) {
            List<T> col = new ArrayList<T>();
            for (List<T> row : table) {
                col.add(row.get(i));
            }
            ret.add(col);
        }
        return ret;
    }
}

См. Также

13
ответ дан 1 December 2019 в 08:52
поделиться

что-то вроде этого, может быть

List<List<String>> list = new ArrayList<List<String>>(firstList.size());
for(int i = 0; i < firstList.size(); i++) {
   list.add(Arrays.asList(
      firstList.get(i),
      secondList.get(i),
      thirdList.get(i))
   );
}
2
ответ дан 1 December 2019 в 08:52
поделиться

Это вызвало операцию транспонирования. Пример кода здесь , но он потребует значительных изменений, поскольку у вас есть ArrayList of Arrays (что я понимаю из вашего вопроса)

2
ответ дан 1 December 2019 в 08:52
поделиться

Вам нужно использовать двумерный массив. Смотрите здесь.

1
ответ дан 1 December 2019 в 08:52
поделиться

Проверьте, все ли списки имеют одинаковый размер.

Поместите информацию в матрицу (например, список с элементами списка), чтобы получить количество списков и размер списка.

Создайте новую матрицу с повернутой информацией о размерах. (От 3x4 до 4x3)

Выполните 2 цикла For и поместите элементы в новую матрицу.

1
ответ дан 1 December 2019 в 08:52
поделиться

Есть ли у вас фиксированное количество списков массивов и имеют ли они фиксированный размер для начала? Если он исправлен, вы можете иметь значение индекса int и обрабатывать каждый ArrayList по очереди в одном и том же цикле. Затем вы можете передать каждое значение во временный список ArrayList, а затем поместить ссылку на него в окончательный список ArrayList для вывода.

Звучит непонятно? Вот примерное решение:

ArrayList tempList = new ArrayList();
ArrayList outputList = new ArrayList();

for(index=0;index<list1.getsize();index++){
// Add null checks and other validation here
tempList.add( list1.get(index) );
tempList.add( list2.get(index) );
tempList.add( list3.get(index) );
outputList.add( tempList );
}
1
ответ дан 1 December 2019 в 08:52
поделиться

Техника называется транспонированием. Пример реализации.

public static MyObject [][] transpose(MyObject [][] m){
    int r = m.length;
    int c = m[r].length;
    MyObject [][] t = new MyObject[c][r];
    for(int i = 0; i < r; ++i){
        for(int j = 0; j < c; ++j){
            t[j][i] = m[i][j];
        }
    }
    return t;
}
2
ответ дан 1 December 2019 в 08:52
поделиться

Математика: вам нужно транспонировать матрицу. Это проще, если вы используете двумерный массив или "список списков", что практически одно и то же с коллекциями. Список массивов тоже работает, но он немного более запутанный.

В этой статье Википедии показаны некоторые алгоритмы транспонирования.

2
ответ дан 1 December 2019 в 08:52
поделиться

Если это для задачи миграции данных, вы можете рассмотреть вашу дружественную электронную таблицу, если ее размер не слишком велик.

Для работы с матрицами есть библиотека jScience, которая поддерживает матрицы. Для простого транспонирования матрицы это было бы излишеством, но это зависит от того, что с ней нужно делать.

1
ответ дан 1 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: