В Linux и Unix вообще "r"
и "rb"
одинаковы. Более конкретно, указатель FILE
, полученный fopen()
в файле в текстовом режиме и в двоичном режиме, ведет себя одинаково в Unix. В окнах и вообще в системах, которые используют более одного символа для представления « newlines », файл, открытый в текстовом режиме, ведет себя так, как если бы все эти символы были всего одним символом, '\n'
.
Если вы хотите портативно читать / записывать текстовые файлы в любой системе, используйте "r"
и "w"
в fopen()
. Это гарантирует, что файлы будут записаны и прочитаны правильно. Если вы открываете двоичный файл, используйте "rb"
и "wb"
, так что неудачный перевод новой строки не испортит ваши данные.
Обратите внимание, что следствие базовой системы, выполняющей перевод новой строки потому что вы не можете определить количество байтов, которое вы можете прочитать из файла, используя fseek (файл, 0, SEEK_END) .
Наконец, см. Что разница между текстом и двоичным вводом / выводом в comp.lang.c Часто задаваемые вопросы .
Это называется транспонированием. Следующий фрагмент делает то, что вам нужно:
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;
}
}
что-то вроде этого, может быть
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))
);
}
Это вызвало операцию транспонирования. Пример кода здесь , но он потребует значительных изменений, поскольку у вас есть ArrayList of Arrays (что я понимаю из вашего вопроса)
Вам нужно использовать двумерный массив. Смотрите здесь.
Проверьте, все ли списки имеют одинаковый размер.
Поместите информацию в матрицу (например, список с элементами списка), чтобы получить количество списков и размер списка.
Создайте новую матрицу с повернутой информацией о размерах. (От 3x4 до 4x3)
Выполните 2 цикла For и поместите элементы в новую матрицу.
Есть ли у вас фиксированное количество списков массивов и имеют ли они фиксированный размер для начала? Если он исправлен, вы можете иметь значение индекса 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 );
}
Техника называется транспонированием. Пример реализации.
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;
}
Математика: вам нужно транспонировать матрицу. Это проще, если вы используете двумерный массив или "список списков", что практически одно и то же с коллекциями. Список массивов тоже работает, но он немного более запутанный.
В этой статье Википедии показаны некоторые алгоритмы транспонирования.
Если это для задачи миграции данных, вы можете рассмотреть вашу дружественную электронную таблицу, если ее размер не слишком велик.
Для работы с матрицами есть библиотека jScience, которая поддерживает матрицы. Для простого транспонирования матрицы это было бы излишеством, но это зависит от того, что с ней нужно делать.