繁体   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