web-dev-qa-db-ja.com

配列から最後の要素を削除する方法は?

現在、再帰的なバックトラッキングを使用しています。私の割り当ては、迷路内で最長のパスを見つけることです。質量は、座標で覆われたフィールドとして表示され、壁の座標はファイル内で痛いです。入力ファイルを解析して壁を構築するパーサーを作成しましたが、次の「ヘビ」の次の部分を移動できるかどうかを確認するために、この座標をオブジェクトタイプCoordinateの配列に保存しました。フィールド、このメソッドを作成した後、バックトラッキングを使用するときに配列から最後の座標を削除する方法が必要であることを理解しました、どうすればできますか?目標は配列リストまたはリンクリストを使用しないことです配列のみ!ありがとうございました!

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;
}

 }
11
Andre Liberty

Java配列はサイズ変更ができないため、すべてを新しい短い配列にコピーする必要があります。

Arrays.copyOf(original, original.length-1)
66
Marko Topolnik

私はその非常に古いスレッドを知っています。それでも、承認された答え自体は私にはうまくいきませんでした。そして、これは私がそれを解決した方法です。

次のようなメソッドを作成します。

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"
    @Test
    public void removeLastElement() {

    String[] lastElementRemoved = { "one", "two", "three" };

    String[] removedElement = Arrays.copyOf(lastElementRemoved, 2);

    System.out.println(Arrays.toString(removedElement));
    }
1
Mahendra Sri