दो बाइट ऐरे की तुलना करें? (जावा)


96

मेरे पास एक बाइट सरणी है जिसमें एक ~ ज्ञात बाइनरी अनुक्रम है। मुझे यह पुष्टि करने की आवश्यकता है कि बाइनरी अनुक्रम वह है जो इसे माना जाता है। मैंने .equalsइसके अलावा कोशिश की है ==, लेकिन न तो काम किया है।

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

क्या आप सीधे तार की तुलना कर सकते हैं?
वस्तुओं

1
@objects - अग्रणी शून्य। इसके अलावा, स्ट्रिंग / बिगइंटर सामान केवल बाइट-ऐरे तुलना प्रश्न को दर्शाने का एक तरीका हो सकता है।
स्टीफन C

क्या आपने तुलना विधि का उपयोग करने की कोशिश की है? BTW ==आदिम मूल्यों की तुलना करता है सिर्फ
फी

यहाँ आंशिक सरणी तुलना के बारे में संबंधित प्रश्न है: stackoverflow.com/questions/16646967/…
वडज़िम

जवाबों:


165

आपके उदाहरण में, आपके पास:

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

जब वस्तुओं के साथ काम करते हैं, ==जावा में संदर्भ मूल्यों की तुलना करते हैं । आप यह देखने के लिए जाँच कर रहे हैं कि क्या सरणी द्वारा दिया गया toByteArray()संदर्भ उसी संदर्भ में रखा गया है array, जो निश्चित रूप से सत्य नहीं है। इसके अलावा, सरणी वर्ग ओवरराइड नहीं करते हैं, .equals()इसलिए यह व्यवहार Object.equals()केवल संदर्भ मूल्यों की तुलना करता है।

दो सरणियों की सामग्री की तुलना करने के लिए , स्थिर सरणी तुलना विधियां एरेस वर्ग द्वारा प्रदान की जाती हैं

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

जावा ऑपरेटरों को अधिभार नहीं देता है, इसलिए आपको आमतौर पर गैर-बुनियादी प्रकारों के लिए एक विधि की आवश्यकता होगी। Arrays.equals () विधि का प्रयास करें ।


11

आप दोनों का उपयोग कर सकते Arrays.equals()हैं और MessageDigest.isEqual()। इन दोनों विधियों में कुछ अंतर हैं।

MessageDigest.isEqual()एक समय-निरंतर तुलना विधि है और Arrays.equals()गैर-समय-स्थिर है और यदि आप इसे किसी सुरक्षा अनुप्रयोग में उपयोग करते हैं तो यह कुछ सुरक्षा समस्याएँ ला सकता है।

अंतर का विवरण Arrays.equals () बनाम MessageDigest.isEqual () पर पढ़ा जा सकता है


3

बेशक, Arrays.equal (बाइट [] पहला, बाइट [] दूसरा) का स्वीकृत उत्तर सही है। मुझे निचले स्तर पर काम करना पसंद है, लेकिन मैं समानता परीक्षण रेंज करने के लिए एक निम्न स्तर के कुशल कार्य को खोजने में असमर्थ था। अगर मुझे किसी को इसकी आवश्यकता हो तो मुझे खुद को कोड़ा मारना होगा:

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;
}

यह पूरी बात के बजाय सरणियों के सबसेट का परीक्षण करने के लिए एक अच्छा समाधान है। हालाँकि, ध्यान दें कि Arrays.equals (बाइट [], बाइट []) आपके द्वारा यहां किए गए कार्यों को बहुत ही सटीक तरीके से करता है (सिवाय दो मानों को एक ही वस्तु को अधिक कुशलता से संभालता है, और अशक्त रूप से पारित होने वाले अशक्त सरणियों को संभालता है)। जब एक मानक पुस्तकालय कार्यान्वयन का उपयोग करने का विकल्प दिया जाता है जो समुदाय द्वारा समर्थित होगा या इसका एक कस्टम कार्यान्वयन लिखेगा जिसे मुझे हमेशा के लिए समर्थन करने की आवश्यकता होगी, तो मैंने हर बार पूर्व को चुना है।
टॉम डिब्बल

4
उत्तर उपयोग के मामले के लिए उपयोगी है जहाँ एक में दो सरणियाँ हैं और बाइट्स की श्रेणी की तुलना करना चाहते हैं, बिना पहले सरणियों की प्रतियां बनाए बिना। सरणी प्रतियां ओवरहेड जोड़ते हैं, कचरा जोड़ते हैं, और ज़रूरत नहीं है। मुझे जो चाहिए था वह एक निम्न-स्तरीय सी स्टाइल मेम्कंप () था और यह जरूरत को पूरा करता है। बेशक, memcmp () केवल 1 लंबाई तर्क लेता है। यह फ़ंक्शन काफी करीब है।
बामको

2

चूंकि मैं एक यूनिट टेस्ट के लिए दो सरणियों की तुलना करना चाहता था और मैं इस जवाब पर पहुंचा कि मुझे लगा कि मैं साझा कर सकता हूं।

आप इसके साथ भी कर सकते हैं:

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

  Assert.assertArrayEquals(array, secondArray);
}

और आप अधिक infos के लिए JUnit के कथनों में तुलनात्मक सरणियों पर जाँच कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.