[英]Sorting an array (Object[]) consisting of integers and strings - Java
我有和Object []類型的數組,包含整數和字符串(單個字母)。
Object[] myArray = {(String) "U", (String) "U", (int) 2, (String) "X", (int) 4, (String) "U"};
我的問題是,是否有一種簡單的方法可以對這個數組進行排序,首先是在字符串之前進行整理,然后按數字升序整數和按字母順序排列字符串? 我正在尋找類似於Arrays.sort方法的東西,但我不認為它會那么簡單。
謝謝
一種方法是提供Comparator<Object>
實例並檢查對象的類型以確定它們的排序:
Arrays.sort(myArray, new IntStringComparator());
//...
public static class IntStringComparator implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
if (o1 == null) {
return -1; // o1 is null, should be less than any value
}
if(o2 == null){
return 1; // o2 is null, should be less than any non-null value
}
if (o1 instanceof Integer) {
if (o2 instanceof Integer) {
return Integer.compare((int) o1, (int) o2); // Compare by int
} else {
return -1; // int < String
}
} else {
if (o2 instanceof String) {
return ((String) o1).compareTo((String) o2); // Compare by string
} else {
return 1; // String > int
}
}
}
}
輸出:
[2, 4, U, U, U, X]
在Java 8中:
Object[] myArray = {(String) "U", (String) "U", (int) 2, (String) "X", (int) 4, (String) "U"};
Stream.of(myArray).filter(x -> !(x instanceof String))
.sorted().forEach(System.out::print);
Stream.of(myArray).filter(x -> x instanceof String)
.sorted().forEach(System.out::print);
對於David Wallace:如果你想保存已排序的數組(在本例中我將它保存到List中,但如果你願意,可以將它轉換成.toArray()
):
Object[] myArray = {(String) "U", (String) "U", (int) 2, (String) "X", (int) 4, (String) "U"};
List<Object> newList = Stream.of(myArray).filter(x -> x instanceof String)
.sorted().collect(Collectors.toList());
Collections.addAll(newList, Stream.of(myArray).filter(x -> !(x instanceof String))
.sorted().toArray());
for (Object o : newList) {
System.out.print(o);
}
OUTPUT (兩個代碼片段):
24UUUX
也就是說,在同一個數組中混合使用不同的類型是一種不好的做法(像你一樣使用Object
)。 只有當它們有一個共同的接口時(或者,如果其中一個擴展另一個),不同類型應該“混合”!
您可以指定用於比較對象的函數,因此可以根據需要使其運行。 有關示例,請參閱Java - 如何通過這些對象中的String字段最有效地對SomeClass對象數組進行排序?
我認為最好的方法是創建一個實現Comparable接口的Generic Class。 這樣你就可以在Array中存儲任何類型並使用compare方法來做任何你想做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.