簡體   English   中英

對由整數和字符串組成的數組(Object [])進行排序 - Java

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM