java - एक ArrayList में चारों ओर वस्तुओं को स्थानांतरित करना




(6)

तो मैं अभी भी जावा के लिए बिल्कुल नया हूं और मैं ऐरेलिस्ट के साथ खेल रहा हूं - जो मैं हासिल करने की कोशिश कर रहा हूं वह ऐसा कुछ करने का तरीका है:

Item 1
Item 2
Item 3
Item 4

तो मैं सूची में वस्तुओं को स्थानांतरित करने में सक्षम होने की कोशिश कर रहा हूं, जब तक कि यह पहले से ही शीर्ष पर नहीं है, इस स्थिति में यह वही रहेगा। उदाहरण के लिए, यदि आइटम 3 स्थानांतरित किया गया था तो सूची होगी:

Item 1
Item 3
Item 2
Item 4

इस समय मेरी छोटी समझ से मैं कुछ के साथ कुछ चाहता हूं:

IF arrayname index is not equal to 0
THEN move up
ELSE do nothing

जिस भाग के साथ मैं संघर्ष कर रहा हूं वह हिस्सा "आगे बढ़ना" है। यह कैसे प्राप्त किया जा सकता है के बारे में कोई सुझाव या कोड नमूने बहुत सराहना की है।


आप इस सरल कोड को आज़मा सकते हैं, Collections.swap (सूची, i, j) वह है जिसे आप ढूंढ रहे हैं।

    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");

    String toMoveUp = "3";
    while (list.indexOf(toMoveUp) != 0) {
        int i = list.indexOf(toMoveUp);
        Collections.swap(list, i, i - 1);
    }

    System.out.println(list);

ऊपर जाने के लिए, हटाएं और फिर जोड़ें।

निकालने के लिए - ArrayList.remove और लौटा ऑब्जेक्ट को एक चर पर असाइन करें
फिर इस ऑब्जेक्ट को आवश्यक अनुक्रमणिका पर वापस जोड़ें - ArrayList.add(int index, E element)

http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html#add(int , ई)


एक सरल स्वैप एक ArrayList में "कुछ चलाना" के लिए कहीं बेहतर है:

if(i > 0) {
    Item toMove = arrayList.get(i);
    arrayList.set(i, arrayList.get(i-1));
    arrayList.set(i-1, toMove);
}

चूंकि एक ArrayList एक सरणी का उपयोग करता है, यदि आप किसी ArrayList से कोई आइटम हटाते हैं, तो उसे उस आइटम के बाद सरणी में अंतर को भरने के लिए सभी तत्वों को "शिफ्ट" करना होगा। यदि आप कोई आइटम डालते हैं, तो उसे उस आइटम के बाद सभी तत्वों को उस स्थान के अंदर स्थानांतरित करने के लिए स्थानांतरित करना होगा। यदि आपकी सरणी बहुत बड़ी है तो ये बदलाव बहुत महंगा हो सकते हैं। चूंकि आप जानते हैं कि आप सूची में तत्वों की एक ही संख्या के साथ समाप्त करना चाहते हैं, इस तरह एक स्वैप करने से आप सूची में किसी तत्व को दूसरे स्थान पर "स्थानांतरित" कर सकते हैं।

चूंकि क्रिस बकलर और मीकल क्रेज़मैन बताते हैं कि कोड की इन तीन पंक्तियों को कम करने के लिए संग्रह वर्ग में भी एक आसान तरीका है:

Collections.swap(arrayList, i, i-1);

जैसा कि मिक्कल ने संग्रह से पहले पोस्ट किया था। रोटेट एक आसान तरीका है। मैं सूची में ऊपर और नीचे की ओर बढ़ने के लिए इस विधि का उपयोग कर रहा हूं।

public static <T> void moveItem(int sourceIndex, int targetIndex, List<T> list) {
    if (sourceIndex <= targetIndex) {
        Collections.rotate(list.subList(sourceIndex, targetIndex + 1), -1);
    } else {
        Collections.rotate(list.subList(targetIndex, sourceIndex + 1), 1);
    }
}

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

2 तत्वों को स्वैप करने के लिए, संग्रह .swap ठीक है। लेकिन अगर हम और तत्वों को स्थानांतरित करना चाहते हैं, तो एक बेहतर समाधान है जिसमें संग्रह। सब्लिस्ट और कलेक्शन। रचना का एक रचनात्मक उपयोग शामिल है जिसे मैंने तब तक नहीं सोचा जब तक मैंने इसे यहां वर्णित नहीं देखा:

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#rotate%28java.util.List,%20int%29

यहां एक उद्धरण दिया गया है, लेकिन वहां जाएं और पूरी चीज को अपने लिए भी पढ़ें:

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

Collections.rotate(list.subList(j, k+1), -1);


सूची में आइटम को Move करने के लिए बस जोड़ें:

// move item to index 0
Object object = ObjectList.get(index);
ObjectList.remove(index);
ObjectList.add(0,object);

सूची में दो आइटम Swap करने के लिए बस जोड़ें:

// swap item 10 with 20
Collections.swap(ObjectList,10,20);




arraylist