java.util.Arrays 类不支持不同数组类型的 compareTo 函数,特别是 byte[] 数组,有什么原因吗?我在这里找到了一个示例实现,但我主要想知道我是否忽略了一些常见的 Java 类。
编辑: compareTo 的行为不像 Arrays.equals 但更像String.compareTo
java.util.Arrays 类不支持不同数组类型的 compareTo 函数,特别是 byte[] 数组,有什么原因吗?我在这里找到了一个示例实现,但我主要想知道我是否忽略了一些常见的 Java 类。
编辑: compareTo 的行为不像 Arrays.equals 但更像String.compareTo
以下是 Java 中数组的通用compare()
函数。您可以根据自己的需要进行修改,以防在非直截了当的场景(不同的长度、空值等)中使一个数组“大于”另一个数组的原因有不同的解释。它也可以很容易地更改为处理原语,例如byte
,int
等。
public static <T extends Comparable<T>> int compareArray(T[] a, T[] b) {
if (a == b) { // also covers the case of two null arrays. those are considered 'equal'
return 0;
}
// arbitrary: non-null array is considered 'greater than' null array
if (a == null) {
return -1; // "a < b"
} else if (b == null) {
return 1; // "a > b"
}
// now the item-by-item comparison - the loop runs as long as items in both arrays are equal
int last = Math.min(a.length, b.length);
for (int i = 0; i < last; i++) {
T ai = a[i];
T bi = b[i];
if (ai == null && bi == null) {
continue; // two null items are assumed 'equal'
} else if (ai == null) { // arbitrary: non-null item is considered 'greater than' null item
return -1; // "a < b"
} else if (bi == null) {
return 1; // "a > b"
}
int comp = ai.compareTo(bi);
if (comp != 0) {
return comp;
}
}
// shorter array whose items are all equal to the first items of a longer array is considered 'less than'
if (a.length < b.length) {
return -1; // "a < b"
} else if (a.length > b.length) {
return 1; // "a > b"
}
// i.e. (a.length == b.length)
return 0; // "a = b", same length, all items equal
}
没有什么特别的原因,除了代码臃肿,这在java中一直扮演着重要的角色:Java安装一直被称为很大的开销。一个 compareTo onbyte[]
会被签名,不是吗?你也想要一个未签名的吗?多久使用一次?对核心 Java 来说可能没什么。
但是你有一个观点:equals 可以使用 compareTo 来实现。
compareTo 在数组上的含义取决于您的用例。因此它没有在 java.util.Arrays 中实现,因为不是每个数组都包含可比较的对象。
如果要compareTo
在数组上实现方法,则必须回答以下问题:
一个数组何时小于、等于或大于另一个数组?
如果数组是byte[]
基于 ascii 字符串的,它可能很容易,但是你有一个特殊的用例。
看看这些问题来理解我的意思:
Comparable
当您对元素的了解比它们是s 的更多时,您将如何比较 s 的数组Comparable
?Comparable
s 数组小于另一个Comparable
s 数组,因为相同索引处的每个元素都小于另一个数组相同索引处的元素,您会得到什么样的信息,您将如何处理这些信息?我认为这byte[]
是一个非常具体的用例,因为您将其byte[]
视为 ascii 字符的字符串,但请记住byte[]
字符串的表示取决于编码。