我Map在一個List.
我需要List通過將輸入作為引數傳遞給方法來動態地對輸入進行排序sortData。
它按預期作業,但問題是無法以相反的順序對串列進行排序。
我收到一個錯誤:The method get(String) is undefined for the type Object
代碼
public class TestingClass {
public static void main(String[] args) {
List< LinkedHashMap<String,Object> > list = new ArrayList<>();
/*Map 2*/
LinkedHashMap<String,Object> lhm1 = new LinkedHashMap<>();
lhm1.put("LONG_HEADER", 2l);
lhm1.put("STRING_HEADER1", "C");
lhm1.put("STRING_HEADER2", "D");
/*Map 2*/
LinkedHashMap<String,Object> lhm2 = new LinkedHashMap<>();
lhm2.put("LONG_HEADER", 1l);
lhm2.put("STRING_HEADER1", "E");
lhm2.put("STRING_HEADER2", "F");
/*Map 3*/
LinkedHashMap<String,Object> lhm3 = new LinkedHashMap<>();
lhm3.put("LONG_HEADER", 3l);
lhm3.put("STRING_HEADER1", "A");
lhm3.put("STRING_HEADER2", "B");
list.add(lhm1);
list.add(lhm2);
list.add(lhm3);
List< LinkedHashMap<String,Object> > sortedList1 = sortData(list,"LONG_HEADER","ASC" );
System.out.println("Output 1 After sorting" sortedList1);
List< LinkedHashMap<String,Object> > sortedList2 = sortData(list,"STRING_HEADER1","ASC" );
System.out.println("Output 2 After sorting" sortedList2);
List< LinkedHashMap<String,Object> > sortedList3 = sortData(list,"STRING_HEADER2","ASC" );
System.out.println("Output 3 After sorting" sortedList3);
/* It won't work */
sortData(list,"LONG_HEADER","DESC" );
sortData(list,"STRING_HEADER1","DESC" );
sortData(list,"STRING_HEADER2","DESC" );
}
private static List<LinkedHashMap<String, Object>> sortData(List<LinkedHashMap<String, Object>> inputGridData,
String sortBy, String sortOrder) {
List<LinkedHashMap<String, Object>> lOutputGridDat = null;
if (inputGridData.get(0).get(sortBy) instanceof Long) {
if( "ASC".equals(sortOrder)) {
lOutputGridDat = inputGridData.stream().sorted(Comparator.comparingLong(o -> ((Long) o.get(sortBy))))
.collect(Collectors.toList());
}
else {
/*Here am getting error if i use .reversed() method*/
//Error : The method get(String) is undefined for the type Object
lOutputGridDat = inputGridData.stream().sorted(Comparator.comparingLong(o -> ((Long) o.get(sortBy))).reversed())
.collect(Collectors.toList());
}
} else {
if( "ASC".equals(sortOrder)) {
lOutputGridDat = inputGridData.stream().sorted(Comparator.comparing(o -> ((String) o.get(sortBy))))
.collect(Collectors.toList());
}
else {
/*Here am getting error if i use .reversed() method*/
// Error : The method get(String) is undefined for the type Object
lOutputGridDat = inputGridData.stream().sorted(Comparator.comparing(o -> ((String) o.get(sortBy))).reversed())
.collect(Collectors.toList());
}
}
return lOutputGridDat;
}
}
輸出 1排序后
[{LONG_HEADER=1, STRING_HEADER1=E, STRING_HEADER2=F}, {LONG_HEADER=2, STRING_HEADER1=C, STRING_HEADER2=D}, {LONG_HEADER=3, STRING_HEADER1=A, STRING_HEADER2=B}]
輸出 2排序后
[{LONG_HEADER=3, STRING_HEADER1=A, STRING_HEADER2=B}, {LONG_HEADER=2, STRING_HEADER1=C, STRING_HEADER2=D}, {LONG_HEADER=1, STRING_HEADER1=E, STRING_HEADER2=F}]
輸出 3排序后
[{LONG_HEADER=3, STRING_HEADER1=A, STRING_HEADER2=B}, {LONG_HEADER=2, STRING_HEADER1=C, STRING_HEADER2=D}, {LONG_HEADER=1, STRING_HEADER1=E, STRING_HEADER2=F}]
uj5u.com熱心網友回復:
首先,值得指出您提供的代碼的一些重要問題:
- 正如我所說,用作泛型型別不是一個好習慣。
Object引入泛型是為了強制型別安全,使用Object泛型型別與根本不使用泛型一樣糟糕。 - 不要將不同型別的元素一起存盤在一個集合中。并避免
instanceof檢查和型別轉換。 - 不要針對具體類撰寫代碼,例如
LinkedHashMap- 必須Map改為變數型別。
如果您懷疑這些建議是否有價值,您可以在本網站上找到有關上述所有帳戶的更詳細說明。
關于您的問題,您的代碼中定義的比較器將無法編譯。
那就是你可以修復它:
Comparator.<Map<String, Object>, String>comparing(
o -> ((String) o.get(sortBy))).reversed()
當您鏈接方法時,編譯器無法根據流元素的型別推斷o內部引數的comparing型別。
引數o不被視為 aMap但Object因此您不能get()對其進行呼叫。
需要明確提供通用型別資訊:<Map<String, Object>, String>. 第一部分- 傳入的引數型別(comparing即流的元素),第二部分是將用于比較的值型別(即字串)。
有關泛型方法語法的資訊,請查看本教程
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/448473.html
