2014-10-14 4 views
8

Теперь я работаю с рекурсивным возвратом назад, мое задание - найти самый длинный путь в лабиринте, масса представлена ​​как поле, покрытое координатами, а координаты стенок больны в файле. Я сделал парсер для синтаксического анализа входного файла и построения стен, но я также сохранил эти координаты в массиве координаты типа объекта, чтобы проверить, можно ли переместить следующий фрагмент «змеи» на следующее поле, то я создал этот метод, теперь я понял, что мне понадобится метод для удаления последней координаты из массива, когда я буду использовать backtracking, как я могу это сделать? Цель состоит не в том, чтобы использовать списки массивов или связанные перечисляет только массивы! Спасибо!Как удалить последний элемент из массива?

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

Поскольку Java массивы не являются изменяемыми, вы должны скопировать все на новый, более короткий массив.

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

Вы уверены? 'Arrays.asList (?)' Будет возвращать readonly 'List'. –

+0

@beckyang 'Arrays.asList' не возвращает список только для чтения, только тот, который имеет фиксированный размер (это представление о массиве, переданном ему). Но вы правы, что это не сработает (потому что 'remove (int)' не поддерживается), и даже если 'remove (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