2009-03-10 15 views
21

मुझे Arrays.deepEquals (ऑब्जेक्ट [], ऑब्जेक्ट []) के बारे में पता है, लेकिन यह आदिम प्रकारों (एरे और ऑटोबॉक्सिंग की देय सीमाओं के लिए काम नहीं करता है, this related post देखें)।जावा में प्राइमेटिव के दो सरणी की तुलना करें?

यह ध्यान में रखते हुए, यह सबसे कुशल दृष्टिकोण है? मामले

if (a == b) 
    return true; 

यह न केवल "दोनों अशक्त" मामलों पकड़ता, लेकिन यह भी "खुद के लिए एक सरणी की तुलना":

boolean byteArrayEquals(byte[] a, byte[] b) { 
    if (a == null && b == null) 
     return true; 

    if (a == null || b == null) 
     return false; 

    if (a.length != b.length) 
     return false; 

    for (int i = 0; i < a.length; i++) { 
     if (a[i] != b[i]) 
      return false; 
    } 
    return true; 
} 

उत्तर

33

अपना पहला तुलना बदले किया जाना है।

हालांकि, एक सरल विकल्प के लिए - Arrays.equals का उपयोग करें जो प्रत्येक आदिम प्रकार के लिए ओवरलोड करता है। (कार्यान्वयन आपके लिए बहुत समान है, सिवाय इसके कि यह लूप से सरणी लंबाई को बढ़ाता है। .NET पर एंटी-ऑप्टिमाइज़ेशन हो सकता है, लेकिन मुझे लगता है कि जेआरई लाइब्रेरी कार्यान्वयनकर्ता शायद JVM के लिए बेहतर जानते हैं :)

+2

मुझे स्कीट किया गया है! –

+0

मैंने सोचा था कि एक लाइब्रेरी विधि थी, लेकिन ट्विकट ने मुझे बल्ले से गहरे एक्वाल्स() का उल्लेख करके फेंक दिया। Arrays.equals() वास्तव में आपके परिवर्तन के साथ इस विधि को करता है, हालांकि यह अस्थायी चर (लंबाई की तुलना करने से पहले) में एक। लम्बाई भी संग्रहीत करता है। –

+0

धन्यवाद! और मैं इनमें से कुछ जानता था, मुझे याद दिलाने के लिए धन्यवाद ... आदमी ने मुझे आलसी बना दिया है! –

15

मुझे लगता है कि सबसे कुशल Arrays कक्षा में सहायक विधियों का उपयोग करना चाहिए, क्योंकि उन्हें अधिक चालाकी से लागू किया जा सकता है। इस मामले में तो,

Arrays.equals(a, b); 
0

का उपयोग मैं अगर यह किसी को भी मदद मिलेगी पता नहीं है, लेकिन यह काम कर रहा है:

 if(type == type_BooleanArray) { 
      boolean eq = Arrays.equals((boolean[]) thisObj, (boolean[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_ByteArray) { 
      boolean eq = Arrays.equals((byte[]) thisObj, (byte[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_ShortArray) { 
      boolean eq = Arrays.equals((short[]) thisObj, (short[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_CharArray) { 
      boolean eq = Arrays.equals((char[]) thisObj, (char[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_IntArray) { 
      boolean eq = Arrays.equals((int[]) thisObj, (int[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_LongArray) { 
      boolean eq = Arrays.equals((long[]) thisObj, (long[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_FloatArray) { 
      boolean eq = Arrays.equals((float[]) thisObj, (float[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_DoubleArray) { 
      boolean eq = Arrays.equals((double[]) thisObj, (double[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else { 
      if(!thisObj.equals(thatObj)) { 
       return false; 
      } 
     } 

जाहिर array.equals(otherArray) करता एक array == otherArray, और नहीं है कि तुम क्या उम्मीद करेंगे ।

संबंधित मुद्दे