2014-03-03 66 views
0

我正在玩數組和迭代器。我不想使用集合。只需簡單的迭代器和由我自己定義的方法。 我有一組學生在數組中(數組的大小等於學生人數),他們按照時間順序(按學生索引(ID)號碼123456,162475在構造函數等)。所以我想創建比前一個更大的新數組(通過一個元素)並添加新學生,但是要保存時間順序。我有創建更大的數組並覆蓋舊的引用的方法,但我不知道如何使用迭代器在特定位置添加元素。對數組[i + 1] = array [i]使用for()會很容易,但我不知道如何用iterator來完成。如何使用Java中的Iterator將元素添加到數組的中間?

這是我的代碼的一部分:

public class GrupaStud { 

public static void main(String[] args) { 
    Student [] s = new Student[5]; 
    s[0]=new Student("Katarzyna", "Gryzipiórko", 123456, 5); 
    s[1]=new Student("Bartosz", "Polański", 162475, 4); 
    s[2]=new Student("Heniek", "Zając", 175642, 3); 
    s[3]=new Student("Konstanty", "Mołotow", 432156, 2); 
    s[4]=new Student("Bogdan", "Cichowlaz", 666555, 2.5); 


    ArrayIterator itab = new ArrayIterator(s); 


    s = biggerArray(s); 
     itab = new ArrayIterator(s); 
     Student nowy =new Student("Małgorzata", "Kopytko", 165642, 4); 
     for (itab.first(); !itab.isDone(); itab.next()) { 
      Student st = (Student) itab.current(); 
    //in my mind that if need to check if index number of current element is bigger than 
    //int index above (165642) , but exactly here I don't know, how to add Student nowy 
    //to the array with moving rest of elements 
      if (st.nrIndex >nowy.nrIndex)  

    } 
} 

public static Student[] biggerArray(Student[] s) 
{ 
     Student[] newArray = new Student[6]; 
     for (int i=0; i<s.length; i++) 
      newArray[i] = s[i]; 
     return newArray; 
} 

} 

回答

0

我會爲你的迭代器遍歷現有值添加到新陣列,而不是在biggerArray初始化所有的值。沒有一種簡單的方法可以像這樣插入數組中間(這就是爲什麼你通常會使用這種類型的東西的原因)。

喜歡的東西:

itab = new ArrayIterator(s); 
    Student[] newArray = new Student[6]; 
    int newIndex = 0; 
    Student nowy =new Student("Małgorzata", "Kopytko", 165642, 4); 
    for (itab.first(); !itab.isDone(); itab.next()) { 
     Student st = (Student) itab.current(); 
     if (st.nrIndex > nowy.nrIndex) { //Not sure about the meaning of this condition, make sure you only add the new student once! 
      newArray[newIndex] = nowy; 
      newIndex++; 
     } 
     newArray[newIndex] = st; 
     newIndex++; 
    } 

這也是有趣的看一看如何ArrayList inplements這一點。它採用System.arraycopy,與您可以採取類似的方法,你在做什麼,並且有:

s = biggerArray(s); 
itab = new ArrayIterator(s); 
int index = 0; 
Student nowy =new Student("Małgorzata", "Kopytko", 165642, 4); 
for (itab.first(); !itab.isDone(); itab.next()) { 
    Student st = (Student) itab.current(); 
    if (st.nrIndex >nowy.nrIndex) { 
     System.arraycopy(s, index, s, index + 1, 5 - index); 
     s[index] = nowy; 
     break; 
    } 
    index++; 
} 
+0

嗯......第二個命題中的「大小」是什麼意思? – RIPI

+0

是的,忘記了這是硬編碼。應該是5,'size-index'試圖獲取自插入項目*之後需要複製的項目數。 – femtoRgon

+1

是的:)你的代碼還有一個錯誤,但我修復了它的文檔後。它應該是System.arraycopy(...),但我的代碼正在工作,並且該人被正確添加:)謝謝:)現在我需要仔細考慮,它是如何工作的,因爲它很聰明:) – RIPI

0

您應該考慮使用一個ArrayList代替它處理插入更好。否則,您將需要移動數組中的所有元素。 ArrayList也會爲你自動擴展,所以在大小不確定時它們是很好的。

ArrayList<Student> students = new ArrayList<Student>(); 
students.add(student1); 
students.add(student2); 
students.add(student3); 

int insertionIndex = 1; 
students.add(insertionIndex, student4); 
+0

是的,我知道所有的事情,我知道,如何在這種情況下使用ArrayList,但我需要實現在簡單數組與運動部件的休息和用iterator添加方法。我不知道該怎麼辦呢:)的for(int i = 0; I RIPI

+0

@RIPI對不起,我剛剛讀到你不想使用集合。 –

0

這是指定的一樣。它接受原始數組和一個要插入的數組,它的長度必須大於一個(好吧,至少至少是)。由於它能夠處理所有(非原始)類型,所以它不能自己創建數組。

功能:

public static final <O> O[] getNewArrayWithInserted(int insertIdx, O toInsert, O[] orig_arr, O[] arr_toInsInto) { 
    int idx = -1; 
    try { 
     for(O o : orig_arr) { 
     idx++;     //First iteration: was -1, now 0 
     if(idx < insertIdx) { 
      arr_toInsInto[idx] = o; 
      continue; 
     } 
     if(idx == insertIdx) { 
      arr_toInsInto[idx++] = toInsert; 
     } 
     arr_toInsInto[idx] = o; 
     } 
    } catch(ArrayIndexOutOfBoundsException abx) { 
     throw new ArrayIndexOutOfBoundsException("idx=" + idx + ", insertIdx=" + insertIdx + ", orig_arr.length=" + orig_arr.length + ", arr_toInsInto.length=" + arr_toInsInto.length + ", original error:" + abx); 
    } 
    return arr_toInsInto; 
} 

被稱爲與(索引中插入-在,隨後要插入的值):

Integer[] intArr2 = ManualArrayInsertWItrIntoNewArray.<Integer>getNewArrayWithInserted(3, 4, intArr, new Integer[intArr.length + 1]);

完整例如:

import java.util.Arrays; 
/** 
    <P>{@code java ManualArrayInsertWItrIntoNewArray}</P> 
**/ 
public class ManualArrayInsertWItrIntoNewArray { 
    public static final void main(String[] ignored) { 

     //You don't have to prefix it with ManualArrayInsertWItr in this static main, 
     //but it's normally called this way. 
     Integer[] intArr = new Integer[] {1, 2, 3, 5, 6, 7, 8, 9}; 

     Integer[] intArr2 = ManualArrayInsertWItrntoNewArray.<Integer>getNewArrayWithInserted(3, 4, 
     intArr, new Integer[intArr.length + 1]); 

     System.out.println("Original: " + Arrays.toString(intArr)); 
     System.out.println("New with insert: " + Arrays.toString(intArr2)); 
    } 
    public static final <O> O[] getNewArrayWithInserted(int insertIdx, O toInsert, O[] orig_arr, O[] arr_toInsInto) { 

     int idx = -1; 

     try { 
     for(O o : orig_arr) { 
      idx++;     //First iteration: was -1, now 0 
      if(idx < insertIdx) { 
       arr_toInsInto[idx] = o; 
       continue; 
      } 

      if(idx == insertIdx) { 
       arr_toInsInto[idx++] = toInsert; 
      } 
      arr_toInsInto[idx] = o; 
     } 
     } catch(ArrayIndexOutOfBoundsException abx) { 
     throw new ArrayIndexOutOfBoundsException("idx=" + idx + ", insertIdx=" + insertIdx + ", orig_arr.length=" + orig_arr.length + ", arr_toInsInto.length=" + arr_toInsInto.length + ", original error:" + abx); 
     } 
     return arr_toInsInto; 
    } 
} 

輸出:

[C:\java_code\]java ManualArrayInsertWItrIntoNewArray 
Original: [1, 2, 3, 5, 6, 7, 8, 9] 
New with insert: [1, 2, 3, 4, 5, 6, 7, 8, 9] 
相關問題