1

java.util.Arrays 类不支持不同数组类型的 compareTo 函数,特别是 byte[] 数组,有什么原因吗?我在这里找到了一个示例实现,但我主要想知道我是否忽略了一些常见的 Java 类。

编辑: compareTo 的行为不像 Arrays.equals 但更像String.compareTo

4

3 回答 3

3

以下是 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
}
于 2015-06-07T19:19:02.347 回答
2

没有什么特别的原因,除了代码臃肿,这在java中一直扮演着重要的角色:Java安装一直被称为很大的开销。一个 compareTo onbyte[]会被签名,不是吗?你也想要一个未签名的吗?多久使用一次?对核心 Java 来说可能没什么。

但是你有一个观点:equals 可以使用 compareTo 来实现。

于 2013-08-08T08:21:37.560 回答
1

compareTo 在数组上的含义取决于您的用例。因此它没有在 java.util.Arrays 中实现,因为不是每个数组都包含可比较的对象。

如果要compareTo在数组上实现方法,则必须回答以下问题:

一个数组何时小于、等于或大于另一个数组?

如果数组是byte[]基于 ascii 字符串的,它可能很容易,但是你有一个特殊的用例。

看看这些问题来理解我的意思:

  1. Comparable当您对元素的了解比它们是s 的更多时,您将如何比较 s 的数组Comparable
  2. 如果您知道一个Comparables 数组小于另一个Comparables 数组,因为相同索引处的每个元素都小于另一个数组相同索引处的元素,您会得到什么样的信息,您将如何处理这些信息?
  3. 如果您比较 2 个可执行文件的二进制表示,您会得到什么信息?

我认为这byte[]是一个非常具体的用例,因为您将其byte[]视为 ascii 字符的字符串,但请记住byte[]字符串的表示取决于编码。

于 2013-08-08T08:14:27.580 回答