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