2013-06-20 8 views
10

को दूर इस तरह एक परीक्षण में:जावा: स्ट्रिंग सरणी की सूची और

@Test 
    public void test() { 
     List<String[]> l = new LinkedList<String[]>(); 
     l.add(new String [] {"test", "123"}); 
     l.add(new String [] {"test", "456"}); 
     l.add(new String [] {"test", "789"}); 

     assertEquals(3, l.size()); 

     l.remove(new String [] {"test", "456"}); 

     assertEquals(2, l.size()); 
    } 

दूसरा दावा (= 2) में विफल रहता है के रूप में equals/hashcodelist.remove में इस्तेमाल किया वस्तु के लिए default हैं। क्या सरणी की तुलना करने के लिए सूची Arrays.equals/Arrays.hashcode का उपयोग करने में सक्षम बनाने का कोई तरीका है? या एकमात्र समाधान किसी ऑब्जेक्ट में स्ट्रिंग सरणी को लपेट रहा है और equals/hashcode ओवरराइड कर रहा है?

उत्तर

6

अमरूद का उपयोग करना, वहाँ है। आप को लागू करने की आवश्यकता होगी एक Equivalence<String[]>:

public final class MyEquivalence 
    extends Equivalence<String[]> 
{ 
    @Override 
    protected boolean doEquivalent(final String[] a, final String[] b) 
    { 
     return Arrays.equals(a, b); 
    } 

    @Override 
    protected int doHash(final String[] t) 
    { 
     return Arrays.hashCode(t); 
    } 
} 

तब आप अपने सूची एक List<Equivalence.Wrapper<String[]>> किया जा रहा है, और डालने/हटाने/आदि का उपयोग करने की आवश्यकता होगी अपने Equivalence के .wrap() विधि:

final Equivalence<String[]> eq = new MyEquivalence(); 
list.add(eq.wrap(oneValue)); 
list.remove(eq.wrap(anotherValue)); 

उपयोग अमरूद । मेरे बाद दोहराएँ। उपयोग अमरूद: p

+1

ठीक से बचाना चाहूंगा! मैं गुवा का उपयोग करूंगा! अमरूद! GUAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAA! धन्यवाद :) – Randomize

4

आप एक नया ऑब्जेक्ट संदर्भ बना रहे हैं और इसे remove() विधि पर पास कर रहे हैं। आपके द्वारा पोस्ट किए गए डेटा से, ऐसा लगता है कि आप दो गुणों के साथ एक कस्टम क्लास बना सकते हैं और equals() और hashCode() को String[] के रूप में संग्रहीत करने के बजाय ओवरराइड कर सकते हैं या String[] ऑब्जेक्ट को संदर्भित रखें और निकालने के लिए उस संदर्भ का उपयोग करें।

+2

+1 सुझाव के लिए एक 'String []' उपयुक्त नहीं होता है –

2

List विधि अक्सर Object विधि equals(Object o) पर आधारित होती है जो डिफ़ॉल्ट रूप से ऑब्जेक्ट के संदर्भ की तुलना करती है। आप बाद में इसे हटा चाहते हैं आप टैब संग्रहीत कर सकते हैं, या अपने स्वयं वर्ग बना सकते हैं और equals(Object o) ओवरराइड;)

@Test 
    public void test() { 
     List<String[]> l = new LinkedList<String[]>(); 
     l.add(new String [] {"test", "123"}); 
     String[] tab = new String [] {"test", "456"}; 
     l.add(tab); 
     l.add(new String [] {"test", "789"}); 

     assertEquals(3, l.size()); 

     l.remove(tab); 

     assertEquals(2, l.size()); 
    } 
+0

नहीं, मेरे मामले में मैं एक ही मूल्यों के साथ वास्तव में एक नई सरणी स्ट्रिंग की है। तो "डिफ़ॉल्ट" ऑब्जेक्ट.क्वल्स/हैशकोड काम नहीं करेगा – Randomize

+0

हां, मैंने अपने प्रश्न में लिखा था और यदि मैं संभव हो तो – Randomize

0

वैसे, जावा 8 एक नया removeIf विधि है कि इस संग्रह है जो दिए गए विधेय को संतुष्ट सभी तत्वों का निकाल देता परिचय

यह आसानी से तार की एक सरणी दूर करने के लिए इस्तेमाल किया जा सकता सूची से:

List<String[]> l = new LinkedList<String[]>(); 
l.add(new String [] {"test", "123"}); 
l.add(new String [] {"test", "456"}); 
l.add(new String [] {"test", "789"}); 

String[] newArray = new String[] {"test", "456"}; 
l.removeIf(array -> Arrays.equals(array, newArray)); 
संबंधित मुद्दे