对由整数和字符串组成的数组(Object [])进行排序 - Java

时间:2015-03-29 01:29:46

标签: java arrays sorting

我有和Object []类型的数组,包含整数和字符串(单个字母)。

Object[] myArray = {(String) "U", (String) "U", (int) 2, (String) "X", (int) 4, (String) "U"};

我的问题是,是否有一种简单的方法可以对这个数组进行排序,首先是在字符串之前进行整理,然后按数字升序整数和字母顺序排列? 我正在寻找类似于Arrays.sort方法的东西,但我认为它不会那么简单。

谢谢

4 个答案:

答案 0 :(得分:2)

一种方法是提供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]

答案 1 :(得分:1)

在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)。不同的类型应该是&#34;混合&#34;只有当他们有一个共同的界面时(或者,如果其中一个扩展另一个)!

答案 2 :(得分:0)

您可以指定用于比较对象的函数,因此可以根据需要使其运行。有关示例,请参阅Java - How can I most-efficiently sort an array of SomeClass objects by a String field in those objects?

答案 3 :(得分:0)

我认为最好的方法是创建一个实现Comparable接口的Generic Class。这样你就可以在数组中存储任何类型并使用比较方法来做你想做的事。