Java中字节[]数组的Arrays.compareTo

Java中字节[]数组的Arrays.compareTo,java,bytearray,Java,Bytearray,对于不同的数组类型,特别是byte[]数组,是否有不支持compareTo函数的原因?我找到了一个示例实现,但我最想知道的是我是否忽略了一些常见的Java类 编辑:compareTo的行为与数组不同。相等,但更像是数组上compareTo的含义取决于您的用例。因此,它不是在java.util.array中实现的,因为不是每个数组都包含可比较的对象 如果要在数组上实现compareTo方法,必须回答以下问题: 一个数组何时小于、等于或大于另一个数组 如果数组是基于ascii字符串的字节[],这可能

对于不同的数组类型,特别是byte[]数组,是否有不支持compareTo函数的原因?我找到了一个示例实现,但我最想知道的是我是否忽略了一些常见的Java类


编辑:compareTo的行为与数组不同。相等,但更像是

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

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

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

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

看看这些问题,了解我的意思:

如果你对元素的了解不多,你会如何比较一系列可比数据? 如果您知道一个可比数据数组小于另一个可比数据数组,因为同一索引中的每个元素小于同一索引中的另一个数组中的元素,您会得到什么样的信息?您会如何处理这些信息? 如果比较两个可执行文件的二进制表示形式,您将得到什么信息?
我认为byte[]是一个非常特殊的用例,因为您认为byte[]是一个ascii字符字符串,但请记住,字符串的byte[]表示形式取决于编码。

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

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

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

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

看看这些问题,了解我的意思:

如果你对元素的了解不多,你会如何比较一系列可比数据? 如果您知道一个可比数据数组小于另一个可比数据数组,因为同一索引中的每个元素小于同一索引中的另一个数组中的元素,您会得到什么样的信息?您会如何处理这些信息? 如果比较两个可执行文件的二进制表示形式,您将得到什么信息?
我认为byte[]是一个非常特殊的用例,因为您认为byte[]是一个ascii字符字符串,但请记住,字符串的byte[]表示形式取决于编码。

除了代码膨胀之外,没有其他特殊原因,这在java中一直扮演着重要的角色:java安装总是被称为巨大的开销。字节[]上的比较器将被签名,不是吗?您也要一个未签名的吗?多久使用一次?核心Java可能什么都没有


但是您有一点:equals可以使用compareTo实现。

除了代码膨胀之外,没有其他具体原因,代码膨胀在java中一直扮演着重要角色:java安装总是被称为一个巨大的开销。字节[]上的比较器将被签名,不是吗?您也要一个未签名的吗?多久使用一次?核心Java可能什么都没有

但您有一点:equals可以使用compareTo实现。

以下是Java中数组的通用比较函数。您可以根据自己的需要进行修改,以防在非直截了当的场景中,对使一个数组大于另一个数组的原因有不同的解释—不同的长度、空值等。。它也可以很容易地更改以处理基本体,如byte、int等

以下是Java中数组的通用比较函数。您可以根据自己的需要进行修改,以防在非直截了当的场景中,对使一个数组大于另一个数组的原因有不同的解释—不同的长度、空值等。。它也可以很容易地更改以处理基本体,如byte、int等


预期它不会提供任何compareTo方法,因为它没有实现Comparable接口。对于一个只有静态方法(比如数组)的类来说,我认为这没有意义。你想实现什么?当应用于数组时,我看不出建议的compareTo的语义目的是什么。@arjacsoh显然它将是静态int compareTobyte[]a,byte[]b@chrylis例如,为了定义一组数组的总顺序,例如,为了将它们或包含它们的对象放在需要这种有序性的集合中,它没有提供任何compareTo方法,因为它没有实现可比较的接口。在我看来,对于一个只有静态方法(如数组)的类来说,这是没有意义的
.你想做什么?当应用于数组时,我看不出建议的compareTo的语义目的是什么。@arjacsoh显然它将是静态int compareTobyte[]a,byte[]b@chrylis例如,为了定义一组数组的总顺序,例如,为了将它们或包含它们的对象放入需要这种顺序的集合中,您不必将字节[]视为ascii字符字符串来比较它们。这只是一个数字数组,你不必把一个字节[]看作一个ascii字符字符串来比较它们。这只是一个数字数组。
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
}