İki Byte Dizisini karşılaştır? (Java)


96

İçinde ~ bilinen bir ikili dizi olan bir bayt dizim var. İkili dizinin olması gerektiği gibi olduğunu doğrulamam gerekiyor. Buna .equalsek olarak denedim ==ama işe yaramadı.

byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
if (new BigInteger("1111000011110001", 2).toByteArray() == array){
    System.out.println("the same");
} else {
    System.out.println("different'");
}

dizeleri doğrudan karşılaştırabilir misin?
nesneleri

1
@nesneler - baştaki sıfırlar. Ayrıca, String / BigInteger şeyler, bayt dizisi karşılaştırma sorusunu göstermenin bir yolu olabilir.
Stephen C

CompareTo yöntemini kullanmayı denediniz mi? BTW ==ilkel değerleri şu anda karşılaştırıyor
ChriskOlson

Kısmi dizi karşılaştırmasıyla ilgili soru: stackoverflow.com/questions/16646967/…
Vadzim

Yanıtlar:


168

Örneğinizde şunlara sahipsiniz:

if (new BigInteger("1111000011110001", 2).toByteArray() == array)

Nesnelerle uğraşırken, ==java'da referans değerleri karşılaştırır . Tarafından döndürülen diziye toByteArray()yapılan referansın tutulan referansla aynı olup olmadığını kontrol ediyorsunuz array, bu elbette asla doğru olamaz. Ek olarak, dizi sınıfları geçersiz kılmaz, .equals()bu nedenle davranış Object.equals()aynı zamanda yalnızca referans değerlerini karşılaştırır.

İki dizinin içeriğini karşılaştırmak için , statik dizi karşılaştırma yöntemleri Arrays sınıfı tarafından sağlanır

byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray();
if (Arrays.equals(array, secondArray))
{
    System.out.println("Yup, they're the same!");
}


11

Java, operatörleri aşırı yüklemez, bu nedenle genellikle temel olmayan türler için bir yönteme ihtiyacınız olacaktır. Arrays.equals () yöntemini deneyin .


11

Her iki kullanabilir Arrays.equals()ve MessageDigest.isEqual(). Yine de bu iki yöntemin bazı farklılıkları var.

MessageDigest.isEqual()sabit bir karşılaştırma yöntemidir ve Arrays.equals()zaman sabit değildir ve bir güvenlik uygulamasında kullanırsanız bazı güvenlik sorunları ortaya çıkarabilir.

Farkın ayrıntıları Arrays.equals () ile MessageDigest.isEqual () arasında okunabilir.


3

Elbette, Arrays.equal'ın kabul edilen yanıtı (önce bayt [], ikinci bayt [] ikinci) doğrudur. Daha düşük bir düzeyde çalışmayı seviyorum, ancak eşitlik testi aralıklarını gerçekleştirmek için düşük düzeyde verimli bir işlev bulamadım. İhtiyaç duyan varsa kendim kırbaçlamak zorunda kaldım:

public static boolean ArraysAreEquals(
 byte[] first,
 int firstOffset,
 int firstLength,
 byte[] second,
 int secondOffset,
 int secondLength
) {
    if( firstLength != secondLength ) {
        return false;
    }

    for( int index = 0; index < firstLength; ++index ) {
        if( first[firstOffset+index] != second[secondOffset+index]) {
            return false;
        }
    }

    return true;
}

Bu, her şeyi değil, dizilerin bir alt kümesini test etmek için iyi bir çözümdür. Bununla birlikte, Arrays.equals'ın (bayt [], bayt []) burada yaptığınız her şeyi tam olarak yaptığını unutmayın (iki değerin aynı nesne olarak daha verimli bir şekilde ele alınması ve boş dizileri sorunsuz bir şekilde ele alması dışında). Topluluk tarafından desteklenecek standart bir kütüphane uygulamasını kullanma ya da sonsuza dek desteklemem gereken özel bir uygulama yazma seçeneği verildiğinde, her seferinde ilkini seçeceğim.
Tom Dibble

4
Cevap, birinin iki diziye sahip olduğu ve önce dizilerin kopyalarını yapmadan bunlardan bayt aralığını karşılaştırmak istediği kullanım durumu için kullanışlıdır. Dizi kopyaları ek yük ekler, gereksiz şeyler ekler ve gerekli değildir. İhtiyacım olan şey, düşük seviyeli c tarzı bir memcmp () idi ve bu ihtiyaca uyuyor. Elbette memcmp () yalnızca 1 uzunluk bağımsız değişkeni alır. Bu işlev yeterince yakın.
Bamaco

2

Bir birim testi için iki diziyi karşılaştırmak istediğimden ve bu cevaba ulaştığım için paylaşabileceğimi düşündüm.

Şunlarla da yapabilirsiniz:

@Test
public void testTwoArrays() {
  byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
  byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray();

  Assert.assertArrayEquals(array, secondArray);
}

Daha fazla bilgi için JUnit iddialarındaki Karşılaştırma dizilerini kontrol edebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.