2010-08-18 14 views
20

ठीक से अंतिम ज्ञात आइटम को निकालने, इसलिए यहाँ मेरी ArrayList है:
मैं ArrayList से अंतिम ज्ञात आइटम हटाने के लिए कोशिश कर रहा हूँ:जावा ArrayList

private List<ClientThread> clients = new ArrayList<ClientThread>(); 

और यहाँ मैं क्या करने की कोशिश कर रहा हूँ मैंने ऊपर पोस्ट किया। मैं नीचे दिए गए कोड के साथ ऐसा करने की कोशिश कर रहा हूँ:

} catch(SocketException re) { 


          String hey = clients.get(clients.size()); 
          ClientThread.remove(hey); 
          System.out.println(hey + " has logged out."); 
          System.out.println("CONNECTED PLAYERS: " + clients.size()); 
} 

लेकिन मैं इस त्रुटि हो रही है:

C:\wamp\www\mystikrpg\Server.java:147: incompatible types 
found : Server.ClientThread 
required: java.lang.String 
         String hey = clients.get(clients.size()); 
               ^
C:\wamp\www\mystikrpg\Server.java:148: cannot find symbol 
symbol : method remove(java.lang.String) 
location: class Server.ClientThread 
         ClientThread.remove(hey); 
            ^
2 errors 

क्या मैं गलत कर रहा हूँ? यह मेरे ArrayList से अंतिम ज्ञात आइटम को निकालना है।

उत्तर

62

यह होना चाहिए:

ClientThread hey = clients.get(clients.size() - 1); 
clients.remove(hey); 

या आप

clients.remove(clients.size() - 1); 

कर सकते हैं शून्य से लोगों क्योंकि आकार() रिटर्न तत्वों की संख्या है, लेकिन ArrayList का पहला तत्व के सूचकांक 0 और नहीं है 1.

+1

ध्यान दें कि '.equals() 'को ओवरराइड करते समय आप बाद के संस्करण का उपयोग करना चाह सकते हैं यह सुनिश्चित करने के लिए कि यह वास्तव में अंतिम वस्तु है जिसे हटा दिया जाता है। –

+1

मेरा मानना ​​है कि सूची में डुप्लीकेट होने पर आपका पहला समाधान ठीक से काम नहीं करेगा। हालांकि, जब आप ऐसी कार्यक्षमता चाहते हैं तो स्थिति भी हो सकती है। – Pijusn

+3

यह ध्यान दिया जाना चाहिए कि किसी सरणी सूची से ऑब्जेक्ट को निकालना ओ (एन) है। दूसरा दृष्टिकोण निरंतर समय है। – Alexander

0

पहली त्रुटि: आप ClientThread को किसी कारण से String के रूप में कास्टिंग कर रहे हैं।

दूसरी त्रुटि: आप अपने List पर remove पर कॉल नहीं कर रहे हैं।

होमवर्क है? यदि ऐसा है, तो आप टैग का उपयोग करना चाह सकते हैं।

8

संकलक शिकायत करता है कि आप ClientThread ऑब्जेक्ट्स की सूची String पर कुछ की कोशिश कर रहे हैं। या तो heyClientThread या clients से List<String> के प्रकार को बदलें।

इसके अतिरिक्त: सूचियों के लिए मान्य सूचकांक 0 से आकार() -1 तक हैं।

तो आप शायद

String hey = clients.get(clients.size()-1); 
+0

+1 यह समझने के लिए कि 'प्राप्त() 'में भेजा गया सूचकांक गलत था, मैंने उसे पकड़ नहीं लिया। –

3

आप स्ट्रिंग hey को clients.get(clients.size()) के रिटर्न मान असाइन करने की कोशिश कर रहे हैं लिखने के लिए चाहते हैं, लेकिन वस्तु लौटे एक ClientThread, नहीं एक श्रृंखला है। Andre mentioned के रूप में, आपको उचित इंडेक्स का भी उपयोग करने की आवश्यकता है।

जहां तक ​​आपकी दूसरी त्रुटि का सवाल है, पर कोई स्थिर विधि remove() नहीं है। वास्तव में, आप शायद अपने List इंस्टेंस, clients की निकासी विधि चाहते थे।

आप निम्नानुसार सूची में से अंतिम आइटम को हटा सकते हैं, यदि कोई है, तो निम्नानुसार है। के बाद से निकालने के भी उद्देश्य यह है कि हटा दिया गया था देता है, आप वापसी पर कब्जा और इसका इस्तेमाल नाम प्रिंट कर सकते हैं:

int size = clients.size(); 

if (size > 0) { 
    ClientThread client = clients.remove(size - 1); 

    System.out.println(client + " has logged out."); 
    System.out.println("CONNECTED PLAYERS: " + clients.size()); 
} 
+0

+1 यह जांचने के लिए कि सूची खाली है या नहीं, –

+0

+1 सही वस्तु पर '.remove()' का उपयोग करने के लिए। हटाने() से वापसी मूल्य का उपयोग करने के लिए कल्पनाशील अतिरिक्त +1। –

1

clients.get एक ClientThread और नहीं एक स्ट्रिंग वापस आ जाएगी, और यह एक IndexOutOfBoundsException साथ बम होगा यदि यह संकलन के लिए आधारित जावा के रूप में संकलित होगा 0।

इसी प्रकार मुझे लगता है कि आपको ग्राहकों की सूची पर निकालना चाहिए।

     ClientThread hey = clients.get(clients.size()-1); 
         clients.remove(hey); 
         System.out.println(hey + " has logged out."); 
         System.out.println("CONNECTED PLAYERS: " + clients.size()); 

मैं हालांकि इस मामले में एक LinkedList के ढेर कार्यों का उपयोग, देखने http://download.oracle.com/javase/1.4.2/docs/api/java/util/LinkedList.html

ClientThread hey = clients.removeLast() 
6

इस लाइन का मतलब है आप एक "ClientThread वस्तुओं की सूची" instantiated होगा।

private List<ClientThread> clients = new ArrayList<ClientThread>(); 

इस लाइन में दो समस्याएं हैं।

String hey = clients.get(clients.size()); 

1. लाइन का यह हिस्सा:

clients.get(clients.size()); 

हमेशाIndexOutOfBoundsException फेंकता हमेशा होता है क्योंकि एक संग्रह आकार एक अपने पिछले तत्व सूचकांक से भी बड़ा;

2. कंपाइलर असंगत प्रकारों के बारे में शिकायत करता है क्योंकि आप स्ट्रिंग ऑब्जेक्ट पर क्लाइंट थ्रेड ऑब्जेक्ट असाइन नहीं कर सकते हैं। सही इस तरह होना चाहिए।

ClientThread hey = clients.get(clients.size()-1); 

अंतिम लेकिन कम से कम नहीं। आप वस्तु को दूर करने के सूचकांक जानते हैं, बस लिखने क्योंकि आप सूचकांक है कि आप पहले से ही पता के लिए खोज करने के लिए सूची के लिए मजबूर कर रहे हैं

clients.remove(23); //Lets say it is in 23. index 

ClientThread hey = clients.get(23); 

    clients.remove(hey); 

न लिखें। यदि आप बाद में हटाए गए ऑब्जेक्ट के साथ कुछ करने की योजना बना रहे हैं।

ClientThread hey = clients.remove(23); 

इस तरह आप ऑब्जेक्ट को हटा सकते हैं और उसी पंक्ति पर इसका संदर्भ प्राप्त कर सकते हैं।

बोनस: कभी भी अपने इंस्टेंस वैरिएबल को "हे" नाम से कॉल न करें। कुछ सार्थक खोजें।

और यहाँ अपने में सुधार किया जाए और रेडी-टू-रन कोड:

public class ListExampleForDan { 

    private List<ClientThread> clients = new ArrayList<ClientThread>(); 

    public static void main(String args[]) { 

     clients.add(new ClientThread("First and Last Client Thread")); 

     boolean success = removeLastElement(clients); 

     if (success) { 

      System.out.println("Last Element Removed."); 

     } else { 

      System.out.println("List Is Null/Empty, Operation Failed."); 

     } 

    } 

    public static boolean removeLastElement(List clients) { 

     if (clients == null || clients.isEmpty()) { 

      return false; 

     } else { 

      clients.remove(clients.size() - 1); 

      return true; 

     } 

    } 
} 

का आनंद लें!

0

आपको java generics समझने की आवश्यकता है। आपके पास ClientThread की एक सूची है लेकिन String प्राप्त करने का प्रयास कर रहा है। आपके पास अन्य त्रुटियां हैं, लेकिन यह बहुत बुनियादी है।