Я уже несколько дней борюсь с этой проблемой. Я пытаюсь создать функциональность Pivot, используя Java-потоки. Мне нужно реализовать только SUM, COUNT, MAX, MIN и AVERAGE. Для ввода мне присваивается индекс сводной столбцы, массив индексов сводных строк и значение для вычисления.Реализация таблицы Java Pivot с использованием потоков
Улов данных есть в списке < Список < Объект >>, где Объект с любой строкой, целым или двойным. но я не буду знать до времени исполнения. И я должен вернуть свои результаты как Список < Список < Объект >>.
У меня возникли проблемы с MAX/MIN (я предполагаю, что средняя будет похож на MAX и MIN)
Для того, чтобы поворачиваться на несколько табличных значений, я создал класс, используя мой мой второй groupingBy
Это не скомпилируется, я не уверен, что сравнивать с тем, где нужно преобразовать объект в int или мне даже нужно. Я хотел бы сделать все это одним потоком, но я не уверен, что это возможно. Что я делаю неправильно, или я могу сделать это по-другому. Заранее спасибо.
package pivot.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
public class PivotTest {
List<List<Object>> rows = new ArrayList<List<Object>>();
public PivotTest() throws Exception {
rows.add(Arrays.asList(new Object[]{ "East", "Boy", "Tee", 10, 12.00}));
rows.add(Arrays.asList(new Object[]{ "East", "Boy", "Golf", 15, 20.00}));
rows.add(Arrays.asList(new Object[]{ "East", "Girl", "Tee", 8, 14.00}));
rows.add(Arrays.asList(new Object[]{ "East", "Girl", "Golf", 20, 24.00}));
rows.add(Arrays.asList(new Object[]{ "West", "Boy", "Tee", 5, 12.00}));
rows.add(Arrays.asList(new Object[]{ "West", "Boy", "Golf", 12, 20.00}));
rows.add(Arrays.asList(new Object[]{ "West", "Girl", "Tee", 15, 14.00}));
rows.add(Arrays.asList(new Object[]{ "West", "Girl", "Golf", 10, 24.00}));
}
// Dynamic Max based upon Column, Value to sum, and an array of pivot rows
public void MaxTable(int colIdx, int valueIdx, int... rowIdx) {
Map<Object, Map<Object, Integer>> myList = newRows.stream().collect(
Collectors.groupingBy(r -> ((List<Object>) r).get(colIdx),
Collectors.groupingBy(r -> new PivotColumns(r, rowIdx),
Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(???)),
r -> ((List<Object>) r).get(valueIdx)))));
System.out.println("Dynamic MAX PIVOT"); System.out.println(myList);
}
public static void main(String[] args) {
try {
PivotTest p = new PivotTest();
System.out.println("\n\nStreams PIVOT with index values inside a List\n");
p.MaxTable(0, 3, new int[] { 2 });
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class PivotColumns {
ArrayList<Object> columns;
public PivotColumns(
List<Object> objs, int... pRows) {
columns = new ArrayList<Object>();
for (int i = 0; i < pRows.length; i++) {
columns.add(objs.get(pRows[i]));
}
}
public void addObject(Object obj) {
columns.add(obj);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((columns == null) ? 0 : columns.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PivotColumns other = (PivotColumns) obj;
if (columns == null) {
if (other.columns != null)
return false;
} else if (!columns.equals(other.columns))
return false;
return true;
}
public String toString() {
String s = "";
for (Object obj : columns) {
s += obj + ",";
}
return s.substring(0, s.lastIndexOf(','));
}
}
Это * огромный * вопрос. Возможно, вы захотите прочитать о вопросах * Минимальный *. См. Http://stackoverflow.com/help/mcve --- Я не зашел далеко, но вы сказали, что у вас есть «Список» объектов, либо «String», «Integer», либо «Double», и это вы не узнаете до времени выполнения, но затем продолжаете показывать четко определенный, полностью типизированный класс «Row». Итак, что это, вы знаете или нет? – Andreas
Любая конкретная причина, по которой он * имеет * потоки? – Andreas
Нет. Я полностью открыт для других решений, не связанных потоками. –