我有以下情況。
給定表:
@Getter
@Setter
@AllArgConstructor
class OldRow {
String type;
String name;
int number;
}
List<OldRow> oldTable
| 型別 | 姓名 | 數字 |
|---|---|---|
| 7 | 亞歷克斯 | 15 |
| 8 | 亞歷克斯 | 17 |
| 9 | 亞歷克斯 | 15 |
| 7 | 約翰 | 33 |
| 8 | 約翰 | 44 |
| 9 | 約翰 | 54 |
需要使用 java 11 將其轉換為以下結構
@Getter
@Setter
@AllArgConstructor
class NewRow {
String Name;
int type7;
int type8;
int type9;
}
List<NewRow> newTable
| 姓名 | 7型 | 8型 | 型別9 |
|---|---|---|---|
| 亞歷克斯 | 15 | 17 | 15 |
| 約翰 | 33 | 44 | 54 |
謝謝
uj5u.com熱心網友回復:
在為您提供方法之前,我想強調一下我在您的代碼中看到的一些外觀錯誤。
您的 java變數名稱應以小寫字母開頭,首字母大寫的名稱用于類命名。
您應該正確縮進您的代碼,以便您(和其他讀者)可以更好地查看代碼塊
我找不到行數更少的優雅解決方案,因此將來有人可能會發布它,但這對您有用。我先分享一下代碼,下面再解釋一下解決方法。
@Getter
@Setter
@AllArgConstructor
class OldRow {
String type;
String name;
int number;
}
@Getter
@Setter
@AllArgConstructor
class NewRow {
String name;
int type7;
int type8;
int type9;
public void printPretty() {
System.out.println(this.name " " this.type7 " " this.type8 " " this.type9);
}
}
public class MainClass {
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
public static void main(String args[]) {
List<OldRow> oldRows = new ArrayList<>();
oldRows.add(new OldRow("8","Alex",17));
oldRows.add(new OldRow("7","Alex",15));
oldRows.add(new OldRow("9","Alex",15));
oldRows.add(new OldRow("7","John",33));
oldRows.add(new OldRow("8","John",44));
oldRows.add(new OldRow("9","John",54));
Map<String,Integer> type7Map = new HashMap<>();
Map<String,Integer> type8Map = new HashMap<>();
Map<String,Integer> type9Map = new HashMap<>();
oldRows.forEach(oldRow -> {
if(oldRow.type.equals("7"))
type7Map.put(oldRow.getName(), oldRow.getNumber());
if(oldRow.type.equals("8"))
type8Map.put(oldRow.getName(), oldRow.getNumber());
if(oldRow.type.equals("9"))
type9Map.put(oldRow.getName(), oldRow.getNumber());
});
List<NewRow> newRows = oldRows.stream()
.filter(distinctByKey(OldRow::getName))
.map(oldRow -> new NewRow(
oldRow.name,
type7Map.get(oldRow.getName()),
type8Map.get(oldRow.getName()),
type9Map.get(oldRow.getName())
))
.collect(Collectors.toList());
for(NewRow newRow : newRows) {
newRow.printPretty();
}
}
}
main 的第一部分是創建OldRow示例中的實體。然后創建 3 個映射來保存每個名稱的type7、type8和type9值。由于您只有這三種型別;我們可以使用靜態數量的地圖。
這些映射通過遍歷oldRows串列來填充,然后通過流式傳輸串列并從maps查找型別值將NewRow物體填充到新陣列中。oldRows
最后是 print 陳述句,這樣你就可以看到newRows陣列的最后一個狀態是什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479289.html
上一篇:為什么完全二叉樹最適合堆實作?
下一篇:替換為下一個最大數
