2014-10-14 5 views
8

अब मैं रिकर्सिव बैकट्रैकिंग के साथ काम कर रहा हूं, मेरा असाइनमेंट भूलभुलैया में सबसे लंबा रास्ता ढूंढना है, द्रव्यमान को निर्देशांक के साथ कवर किया गया क्षेत्र के रूप में प्रस्तुत किया जाता है, और दीवारों के निर्देशांक फ़ाइल में परेशान होते हैं। मैंने इनपुट फ़ाइल को पार्स करने और दीवारों का निर्माण करने के लिए एक पार्सर बनाया है, लेकिन मैंने इस निर्देशांक को ऑब्जेक्ट प्रकार कोऑर्डिनेट की सरणी में भी संग्रहीत किया है, यह जांचने के लिए कि क्या "सांप" के अगले भाग को स्थानांतरित करना संभव है या नहीं अगला फ़ील्ड, फिर मैंने इस विधि को बनाया है, अब मुझे समझ में आया है कि जब मैं बैकट्रैकिंग का उपयोग करूंगा, तो सरणी से अंतिम समन्वय को हटाने के लिए मुझे एक विधि की आवश्यकता होगी, मैं इसे कैसे कर सकता हूं? लक्ष्य सरणी सूचियों या लिंक का उपयोग नहीं करना है केवल सरणी सूचीबद्ध करता है! धन्यवाद!किसी सरणी से अंतिम तत्व को कैसे हटाएं?

public class Coordinate { 
int xCoord; 
int yCoord; 

Coordinate(int x,int y) { 
    this.xCoord=x; 
    this.yCoord=y; 
} 

public int getX() { 
    return this.xCoord; 
} 

public int getY() { 
    return this.yCoord; 
} 
public String toString() { 
    return this.xCoord + "," + this.yCoord; 

} 

} 

और

public class Row { 
static final int MAX_NUMBER_OF_COORD=1000; 

Coordinate[] coordArray; 
int numberOfElements; 


Row(){ 
    coordArray = new Coordinate[MAX_NUMBER_OF_COORD]; 
    numberOfElements=0; 

    } 


void add(Coordinate toAdd) { 
    coordArray[numberOfElements]=toAdd; 
    numberOfElements +=1; 
} 
boolean ifPossible(Coordinate c1){ 
    for(int i=0;i<numberOfElements;i++){ 

     if(coordArray[i].xCoord==c1.xCoord && coordArray[i].yCoord==c1.yCoord){ 
       return false; 
      } 
     } 


    return true; 
} 

} 
+1

है 'arrays' अनिवार्य का उपयोग करें? आप ऑब्जेक्ट विविधता जैसे 'ArrayList' या अन्य सहायक सहायक विधियों के साथ जा सकते हैं। –

+0

हां यह अनिवार्य है, मुझे पता है कि यह उनका उपयोग करने के लिए बेवकूफ है, लेकिन यह अनिवार्य है! –

उत्तर

41

के बाद से जावा सरणियों गैर पुनः आकार देने योग्य हैं, आप एक नया, छोटे सरणी में सब कुछ नकल करना होगा।

Arrays.copyOf(original, original.length-1) 
-1
Arrays.asList(ARRAY_NAME).remove(ARRAY_NAME.length) 
+0

क्या आप निश्चित हैं? 'Arrays.asList (?) 'एक पठनीय' सूची 'वापस कर देगा। –

+0

@beckyang 'Arrays.asList' एक पठनीय सूची नहीं लौटाता है, केवल एक जिसे एक निश्चित आकार है (यह उस सरणी पर एक दृश्य है)। लेकिन आप सही हैं कि यह काम नहीं करेगा (क्योंकि 'हटाएं (int) 'समर्थित नहीं है), और यहां तक ​​कि अगर' हटाएं (int)' समर्थित किया गया था तो भी यह 'ArrayIndexOutOfBoundsException' को फेंक दिया होगा। –

2

मैं अपने एक बहुत पुरानी धागा पता है। अभी भी स्वीकृत उत्तर स्वयं मेरे लिए काम नहीं करता है। और इस तरह मैंने इसे हल किया।

इस तरह की एक विधि बनाएं:

String[] sliceArray(String[] arrayToSlice, int startIndex, int endIndex) throws ArrayIndexOutOfBoundsException { 
    if (startIndex < 0) 
     throw new ArrayIndexOutOfBoundsException("Wrong startIndex = " + startIndex); 
    if (endIndex >= arrayToSlice.length) 
     throw new ArrayIndexOutOfBoundsException("Wrong endIndex = " + endIndex); 

    if (startIndex > endIndex) { // Then swap them! 
     int x = startIndex; 
     startIndex = endIndex; 
     endIndex = x; 
    } 

    ArrayList<String> newArr = new ArrayList<>(); 
    Collections.addAll(newArr, arrayToSlice); 
    for (int i = 0; i < arrayToSlice.length; i++) { 
     if (!(i >= startIndex && i <= endIndex)) // If not with in the start & end indices, remove the index 
      newArr.remove(i); 
    } 
    return newArr.toArray(new String[newArr.size()]); 
} 

तो इस तरह यह कहा जाता है:

String lines[] = {"One", "Two", "Three", "Four", "Five"}; 
lines = sliceArray(lines, 0, 3); 

यह परिणाम होगा में:

"One", "Two", "Three", "Four" 

अब मैं जो भी में सरणी काट कर सकते हैं जिस तरह से मैं चाहता हूँ!

lines = sliceArray(lines, 2, 3); 

यह परिणाम होगा में:

"Three", "Four" 
+1

यदि आपको प्रारंभ और समाप्ति की संभावना निर्दिष्ट करने की आवश्यकता है तो आपको 'Arrays.copyOfRange' का उपयोग करना चाहिए – puhlen

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