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

对由整数和字符串组成的数组(对象[])进行排序-Java,java,arrays,sorting,Java,Arrays,Sorting,我有Object[]类型的和数组,包含整数和字符串(单个字母) 我的问题是,有没有一种简单的方法来排序这个数组,首先是按字符串前的整数排序,然后是按整数升序排序,然后是按字母顺序排序? 我在寻找类似于Arrays.sort方法的东西,但我认为它不会那么简单 谢谢您可以指定用于比较对象的函数,并使其按您喜欢的方式运行。有关示例,请参见Java 8中的: Object[] myArray = {(String) "U", (String) "U", (int) 2, (String) "X"

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

我的问题是,有没有一种简单的方法来排序这个数组,首先是按字符串前的整数排序,然后是按整数升序排序,然后是按字母顺序排序? 我在寻找类似于Arrays.sort方法的东西,但我认为它不会那么简单


谢谢

您可以指定用于比较对象的函数,并使其按您喜欢的方式运行。有关示例,请参见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:如果您想保存已排序的数组(在本例中,我将其保存到列表中,但如果您愿意,可以将其转换为
.toArray()
):


也就是说,在同一个数组中混合不同的类型是一种不好的做法(像您那样使用
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
            }
        }
    }
}

我认为最好的方法是创建一个泛型类,它将实现可比较的接口。这样,您就可以在数组中存储任何类型,并拥有一个比较方法来执行任何您想要的操作。

这样做没有任何意义,只需创建字符数组或字符串数组,您就可以使用数组对其进行排序。排序。谢谢您的回答!我可以请你详细说明一下吗?我对Java相当陌生,但据我所知,你的建议可能行不通?i、 在字符串数组中包含int(如您所建议的)不起作用@libik@user3636636具有一系列异构类型通常表明存在设计问题。为什么要将字符串文本转换为
String
,将整数文本转换为
int
?OP在输出中请求
int
s之前的
int
s。感谢您的回答!非常有用。考虑到我所做的是不好的实践,您可以建议一个更好的数据结构来保存给定的int和string吗?多谢各位@alfasin@user3636636好。。重点不是提供不同的数据结构,重点是不同的类型不应该混合!如果有一个共同的含义,那么应该有一个对象来包装它们并反映这个属性。但是因为我不知道这个练习背后的意图是什么-我找不到int和string共享的公共属性。讽刺的是,它们几乎使静态键入在这里看起来毫无意义!这并不是对数组进行排序,是吗?你永远不会得到一个先有数字,然后是字母,按顺序排序的数组。
    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);
    }
24UUUX
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]