2014-10-14 18 views
8

Bây giờ tôi đang làm việc với backtracking đệ quy, nhiệm vụ của tôi là tìm đường đi dài nhất trong mê cung, khối lượng được trình bày dưới dạng trường được bao phủ bởi tọa độ, và tọa độ của các bức tường bị đau trong tập tin. Tôi đã thực hiện một trình phân tích cú pháp để phân tích tệp đầu vào và xây dựng các bức tường, nhưng tôi cũng đã lưu trữ tọa độ này trong mảng của một loại đối tượng Tọa độ, để kiểm tra xem có thể di chuyển phần tiếp theo của "con rắn" trên trường tiếp theo, sau đó tôi đã tạo phương thức này, bây giờ tôi đã hiểu rằng tôi sẽ cần một phương pháp để loại bỏ tọa độ cuối cùng khỏi mảng khi tôi sử dụng backtracking, làm cách nào tôi có thể thực hiện được? chỉ liệt kê các mảng! Cảm ơn bạn!Làm thế nào để xóa phần tử cuối cùng khỏi một mảng?

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

là 'arrays' sử dụng bắt buộc? Bạn có thể đi với biến thể Object như 'ArrayList' hoặc các phương thức hữu ích khác. –

+0

Có nó là bắt buộc, tôi biết nó là ngu ngốc để sử dụng chúng, nhưng nó là bắt buộc! –

Trả lời

41

Kể từ mảng Java đều là phòng không thay đổi kích thước, bạn sẽ phải sao chép tất cả mọi thứ vào một mảng ngắn mới.

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

Bạn có chắc chắn không? 'Arrays.asList (?)' Sẽ trả về một 'Danh sách' chỉ đọc. –

+0

@beckyang 'Arrays.asList' không trả về danh sách chỉ đọc, chỉ một danh sách có kích thước cố định (đó là chế độ xem trên mảng được truyền cho nó). Nhưng bạn đúng rằng điều này sẽ không hoạt động (vì 'remove (int)' không được hỗ trợ), và ngay cả khi 'remove (int)' đã được hỗ trợ, nó sẽ ném một 'ArrayIndexOutOfBoundsException'. –

2

Tôi biết nó a thread rất cũ. Vẫn chính câu trả lời đã được phê duyệt không làm việc cho tôi. Và đây là cách tôi giải quyết nó.

Tạo một phương pháp như thế này:

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()]); 
} 

Sau đó gọi nó như thế này:

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

này sẽ cho kết quả:

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

Bây giờ tôi có thể cắt những mảng trong bất cứ theo cách tôi muốn!

lines = sliceArray(lines, 2, 3); 

này sẽ cho kết quả:

"Three", "Four" 
+1

Nếu bạn cần chỉ định một thuộc tính bắt đầu và kết thúc, bạn nên sử dụng 'Arrays.copyOfRange' – puhlen

Các vấn đề liên quan