2013-02-11 139 views
0

我試圖從下降課程的學生,這是我得到迄今..如何從數組中刪除元素?

public void dropStudent() { 

String id;  
System.out.println(" Enter student ID ");  
id = Keyboard.readString(); 

    for (int i = 0; i <= students.length - 1; i++) 
    { 
     if (id.equals(students[i].displayId())) 
     { 
      for (int j = i; j <= students.length - 1; j++) 
      { 
      students[i] = students[i+1]; 

      } 

     }  
    } 
} 

所以第一個循環是對數組的每一個元素,如果該語句是來檢查id輸入的是匹配數組中學生的ID。第二個「For」是將元素轉移回去。當我嘗試它時,它確實會刪除特定的學生。但不是將元素移回,而是將這兩個元素複製到兩個地方。我試圖將元素設置爲null,但它不起作用。

有什麼建議嗎?我也不允許使用數組列表或其他東西。

+1

Java不是JavaScript(反之亦然)。不要混淆他們。 – Joseph 2013-02-11 03:19:38

+0

http://en.wikipedia.org/wiki/List_of_computer_term_etymologies#J – 2013-02-11 03:20:26

+0

好吧,我的錯。 – 2013-02-11 03:22:02

回答

1
  1. 使用變量「j」在你的第二環路
  2. 固定你的邏輯,使得「J + 1」將不導致至數組索引超出範圍
2

更換

students[i] = students[i+1]; 

有:

students[j] = students[j+1]; 

事實上,你想通過數組的其餘所有與循環變量j而不是與i代表指數的學生被刪除。

此外,您還需要取代你的循環

for (int j = i; j <= students.length - 1; j++) 

for (int j = i; j <= students.length - 2; j++) 

(注意1 2改)

這樣做的原因是你正在訪問students與索引j + 1,其中,如果j == students.length - 1,將等於students.length,因此你將有一個A rrayOutOfBounException。

最後,您必須將數組的最後一個元素設置爲空(或最後一名學生將被複制)。或者更好的是,您可以調整數組的大小(即創建一個新數組並複製其中的新學生列表)。

另外,如果您有數組中的學生的幾個副本,而您只想刪除第一個,則必須在找到要刪除的元素時添加break

+0

另外,他應該在內循環之後添加一個'break;',除非他想消除學生的所有副本。 – 2013-02-11 03:28:55

+0

我已經試過了,它沒有工作,總是給出一個例外。 – 2013-02-11 03:34:39

+0

我更新了我的答案和其他必須做的工作。嘗試一下,看看是否還有一個例外。如果是,告訴我們它是什麼。 – 2013-02-11 03:36:15

2

你可以做到以下幾點:

  1. 你想消除陣列中的給定的「X」的位置,你只是 做出離開的所有元素的篩上 數組的下一個位置。保持一個大小變量減少它;

  2. 你可以有一個標誌 上有學生信息,當你刪除你 標記爲已刪除的標誌。 False - >已刪除,True - >未刪除。可以使用ArrayList而不是數組。

如果順序並不重要,你可以簡單地做:

for (int i = 0; i <= students.length - 1; i++) 
    { 
     if (id.equals(students[i].displayId())) 
     { 
      students[i] = students[students.length-1]; 
     }  
    } 

只取最後一個元素,並貼合實際的差距。但是,您必須對最後一個位置進行一些操作,將其標記爲空(例如,您可以將其設置爲空)。

如果訂單做的事,那麼你也可以使用一個輔助陣列做:

Students [] removeFrom(Students [] old_array, int pos) 
{ 
    Students [] new_array = new Students[old_array-1]; 

     for (int j = 0; j < i ; j++) new_array[j] = old_array[j]; 

     for (int j = i; j < new_array.length; j++) new_array[j] = old_array[j+1]; 

     return new_array;  
} 

在:

for (int i = 0; i <= students.length - 1; i++) 
    { 
     if (id.equals(students[i].displayId())) 
     { 
      students = removeFrom(students, i); 
     }  
    } 
+0

我可以在不減小數組大小的情況下執行此方法嗎?我的意思是通過使舊的和新的陣列具有相同的尺寸? – 2013-02-11 03:55:16

+1

是的,你可以。但是,您必須以某種方式標記刪除元素。例如,您可以將其設置爲null,但在將來操作數組時,您必須考慮這一點。 – dreamcrash 2013-02-11 03:57:43

+0

確實,我試圖將它設置爲null,並且它給了一個Exception。非常感謝你的幫助 ! – 2013-02-11 04:14:36

4

你不能改變實例化後的Java數組的大小。如果所有需要的都是返回一個沒有學號的數組。你想創建一個新的數組少一個元素,並遍歷原始數組,複製除了你想要刪除的id之外的所有數據。

通常情況下,您想要使用此列表。但考慮到你的限制,我就是這樣解決它的。

是這樣的:

public String[] dropStudent(String delete, String[] students){ 
    int length=students.length-1, i=0; 
    String[] remainingStudents= new String[length]; 

    for(String student: students){ 
     // catch the edge case where 'delete' is not found, and avoid the ArrayIndexOutOfBoundsException 
     if(i==remainingStudents.length){ 
      return students; 
     } 
     // Add the any non-matching students to the final array. 
     if(!student.equals(delete)){ 
      remainingStudents[i]=student; 
      i++; 
     } 
    } 
    return remainingStudents; 
} 
+0

我不想改變數組的大小,而是想刪除一個元素並將其餘元素全部移回。 – 2013-02-11 03:37:30

+1

那麼,你對數組中最後一個位置的要求是什麼?你是否應該將它設置爲空字符串?或者,只需複製最後一個元素? – 2013-02-11 03:38:39

+0

的確如此,我試圖讓它變成空的。我試圖將它設置爲null,但它不起作用。 – 2013-02-11 03:53:09