2017-02-27 6 views
2

私はspliceと同じ機能を持つメソッドを作成することになりますが、適切なインデックスに適切な値を取得できません。私のコードは次のように動作しますが、私は後で私の主な方法でコマンドを与えるときスプライスのようなJavaのメソッドを書く方法

public void PlaceElementAt(int newValue, int index) throws ArrayIndexOutOfBoundsException { 

    //check that index is valid 
    if (index >= 0 && index <= data.length) { //Checks that the index is within position 0 and 7 by default. 
     System.out.println ("Index is valid"); //returns index is valid if so 
    } 
    //increase size if necessary 
    if (data.length == numElements) { //checking if the number of elements is filling the spaces 
     doubleCapacity();    // calls upon the double capacity method if it is 
    } 
    if (numElements==0) { 
     data[numElements] = newValue; 
     System.out.println ("Element: " + data[numElements] + " at index: " + index); 
     numElements++; 
    } 
    //shuffle values down from index 
    else { 
    int bottompos = numElements-1; 
    int loopcount = numElements-index; 
    int NewBottom = numElements+1; 
    for (int i=0; i<loopcount; i++){ 
     data[bottompos]=data[NewBottom]; 
     bottompos--; 
     NewBottom--; 
    } 
     //insert newValue at index 
     data[numElements] = newValue; 
     System.out.println ("Element: " + data[numElements] +" at index: " + index);  
     numElements++; 

    } 
} 

は私の問題は明らかです。

myData.PlaceElementAt(3,0)

myData.PlaceElementAt(2,5)

myData.PlaceElementAt(7,3)

私は私のブレークポイントをチェックしたら、私は値が表示さ配列に追加されていますが、インデックス0から1から1の基準で追加されています。どんな提案も大きな助けになります。

+3

Javaはスプライス方法を持っていません。 – shmosel

+0

@shmosel私は彼が1つを作ろうとしていると思う。少なくとも、私は彼の問題の記述から集めたものです。 –

+0

@HypnicJerkコメントを理解するには、[改訂履歴](http://stackoverflow.com/posts/42496438/revisions)を参照してください。 – shmosel

答えて

1

私はあなたのクラスがどのように構造化されているかについていくつかの仮定をしていますが(必要に応じて調整します)、一般的にはプロセス全体を簡略化するので、右にシフトすることをおすすめします。基本的には、最大許容サイズがMAXであり、現在のサイズがsizeである配列があります。配列に追加するたびに、sizeの値を1つ増やします(挿入やリストの後ろに追加するなど)。ここで、valueindexに挿入するとします。これは、このインデックスの右と右のすべての要素を右に1つシフトし、私たちが作ったスペースにvalueを挿入することを伴います。挿入する前に、まずアイテムを挿入するのに十分なスペースがあることを確認する必要があります。十分なスペースがない場合は、スペースを追加したり、挿入を禁止したり、その他の方法をとる必要があります。あなたの場合は、より多くのスペースを割り当てたいようです。

class MyList 
{ 
    private int MAX = 6; 
    private int size = 0; 
    private int[] array; 

    public MyList() 
    { 
    array = new int[MAX]; 
    } 

    public void placeElementAt(int value, int index) 
    { 
    if (size == 0) 
    { 
     // If size is 0, just insert the value at index 0. 
     array[size++] = value; 
     return; 
    } 

    if (index < 0 || index >= size) 
    { 
     // Index is out of bounds. 
     System.out.println("Invalid index."); 
     return; 
    } 

    if (size >= MAX) 
    { 
     // Max capacity reached -> allocate more space. 
     doubleCapacity(); 
    } 

    // Shift all elements at and above index right by 1. 
    for (int i = size - 1; i >= index; i--) 
    { 
     array[i + 1] = array[i]; 
    } 

    // Insert element. 
    array[index] = value; 
    size++; 
    } 

    public void doubleCapacity() 
    { 
    int[] newArray = new int[MAX * 2]; 

    // Copy old elements to new array. 
    for (int i = 0; i < size; i++) 
    { 
     newArray[i] = array[i]; 
    } 

    // Double MAX to reflect new array. 
    MAX *= 2; 
    array = newArray; 

    System.out.println("Doubled"); 
    } 

    public void add(int value) 
    { 
    if (size >= MAX) 
    { 
     // Max capacity reached -> allocate more space. 
     doubleCapacity(); 
    } 

    // Add the element to the back of the list. 
    array[size++] = value; 
    } 

    public void print() 
    { 
    for (int i = 0; i < size; i++) 
    { 
     System.out.print(array[i] + " "); 
    } 
    System.out.println(); 
    } 

    public static void main(String[] args) 
    { 
    MyList data = new MyList(); 
    data.placeElementAt(1, 0); 
    data.print(); 
    data.placeElementAt(2, 0); 
    data.print(); 
    data.placeElementAt(3, 0); 
    data.print(); 
    data.placeElementAt(5, 0); 
    data.print(); 
    data.placeElementAt(3, 0); 
    data.print(); 
    data.placeElementAt(9, 0); 
    data.print(); 
    data.placeElementAt(4, 0); 
    data.print(); 
    data.placeElementAt(6, 0); 
    data.print(); 
    } 
} 

でしょう(初期MAX = 6付き)このプログラムの出力...

1 
2 1 
3 2 1 
5 3 2 1 
3 5 3 2 1 
9 3 5 3 2 1 
Doubled 
4 9 3 5 3 2 1 
6 4 9 3 5 3 2 1 
+0

これは、配列の最後の数字が重複しているようだが、これは私の問題を完全に解決する。たとえば、次のコマンドのリストを使用します。myData.insertElementAt(1,0); myData.insertElementAt(2,0); myData.insertElementAt(3,0); myData.insertElementAt(5,0);私の配列は5,3,2,1,1,0になる – Serkuto

+0

あなたの質問にあなたの更新されたコードを投稿できますか? 'data.placeElementAt(1,0);' 'data.print();' 'data.placeElementAt(2、0);' 'data.print();'次のコードを実行すると、 'data.placeElementAt(3、0);' ' data.print();' ' data.placeElementAt(5、0);' ' data.print();' Iが出力として得ます。 '1'、 ' 2 1'、 '3 2 1'、 ' 5 3 2 1' – dwhite5914

+0

オリジナルのコードを編集して問題の一部である場合に備えて 'doubleCapacity'メソッドを追加しました。サンプル出力。 – dwhite5914

0

コードを見ると、「インデックス」パラメータが表示されます。しかし、配列に挿入するためにインデックスを使用していません。

あなたのコード:

data[numElements] = newValue; 
numElements++; 

これを試してみてください:

data[index] = newValue; 
numElements++; 

私は、これはそれを解決すると思いますが、後で指定したインデックスがすでに要素を持っているケースを処理する必要があります。

関連する問題