String ArrayList, который необходимо преобразовать в 2-мерный массив - PullRequest
0 голосов
/ 20 декабря 2018

Справочная информация:

Я работаю над проектом очистки, использующим Selenium, который получает данные из таблиц на веб-страницах в наших средах тестирования и производства, а затем сохраняет эти данные в двух отдельных списках массивов.Тип строки (один для теста / продукта).Данные являются числами (двойными) и имеют 3 столбца и где-то 13-16 строк данных.Это варьируется, потому что я собираю данные из более чем 145 стран, и каждая таблица отличается.

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

Проблема:

Проблема заключается в том, что я пытаюсь преобразовать данные издва списка массивов, которые у меня есть, в два двумерных массива.Раньше я работал с очень простыми 2d массивами, но создал их только из пользовательского ввода.

Основываясь на проведенном ранее исследовании, синтаксис для преобразования ArrayList в массив выглядит так:

  ArrayList<String> b = new ArrayList<>();
    b.add("1.50");
    b.add("3.12");
    b.add("5.25%");
    b.add("2.16");
    b.add("4.36");
    b.add("7.76%")
  //This is just a snippet, remember the list would have anywhere from 13-16  
    indices.

  String[] x = b.toArray();

Но как мне преобразовать этот же список в двумерный массив вформат

  1.50 3.12 5.25% 
  2.16 4.36 7.76% 

начало новой строки после каждого третьего индекса?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Вы можете перебирать свой список и добавлять записи вручную в 2d-массив:

String[][] array = new String[b.size()/3][3];
for (int i = 0; i < b.size(); i++) {
  int row = i / 3;
  int col = i % 3;
  array[row][col] = b.get(i);
}

System.out.println(Arrays.deepToString(array));
0 голосов
/ 20 декабря 2018

Вы должны зациклить List и добавить элементы к новому, если не найдете значение с процентом (%) в нем.Затем вы создаете новый List.Это решение основано на внешнем виде символа %, а не на фиксированном размере разрыва между элементами для разделения, что может быть преимуществом.

List<List<String>> outer = new ArrayList<>();
List<String> inner = new ArrayList<>();

for (String s: b) {
    inner.add(s);
    if (s.contains("%")) {
        outer.add(inner);
        inner = new ArrayList<>();
    }
}

List<List<String>> outer будет содержать следующие значения:

[[1,50, 3,12, 5,25%], [2,16, 4,36, 7,76%]] *

Для преобразования структуры из List<List<String>> в String[][] вы можете использовать или простой цикл for, повторяющий и заполняющий массив.

String[][] array = outer.stream()
   .map(a -> a.stream().toArray(String[]::new))   // List<String> to String[]
   .toArray(String[][]::new);                     // List<String[]> to String[][]
0 голосов
/ 20 декабря 2018

Типичный цикл for должен делать:

List<List<String>> accumulator = new ArrayList<>();
for (int i = 0; i < b.size(); i+=3) {
    List<String> temp = new ArrayList<>(b.subList(i, i + 3));
    accumulator.add(temp);
}

accumulator теперь выглядит следующим образом:

[[1.50, 3.12, 5.25%], [2.16, 4.36, 7.76%]]

обратите внимание, что в приведенном выше предположении вы всегда будете иметь список, кратныйиз трех, если это не так, то вы можете обработать это следующим образом:

List<List<String>> accumulator = new ArrayList<>();
for (int i = 0; i < b.size(); i+=3) {
     List<String> temp = b.stream().skip(i).limit(3).collect(toList());
     accumulator.add(temp);
}

, если вам строго требуется, чтобы результат был String[][], тогда вы можете получить его следующим образом:

 String[][] strings = 
        accumulator.stream()
                   .map(l -> l.toArray(new String[0]))
                   .toArray(String[][]::new);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...