2015-06-03 4 views
-1

Для этого общего массива я добавил метод reverse(), который должен отменить массив без использования дополнительного массива элементов, и я пытаюсь выполнить обратное «in situ», используя только swap операции. Но я, возможно, ошибался, и если да, то как его можно отменить «на месте», используя только операции свопинга?Реверсирование общего массива с использованием «in situ»

import java.util.Collections; 

class GenericArray<E> { 
    private E[] array; 
    private int size; 

    public GenericArray() { 
     array = (E[]) new Object[10]; 
     size = 0; 
    } 

    public E get(int i) { 
     return array[i]; 
    } 

    public void set(int i, E value) { 
     if (i < size) 
      array[i] = value; 
    } 

    public void add(E value) { 
     array[size++] = value; 
    } 

    public boolean isFull() { 
     return size == array.length; 
    } 

    public void remove(int i) { 
     for (int j = i; j < size; j++) 
      array[j] = array[j + 1]; 
     size--; 
    } 

    public void insert(int i, E value) { 
     for (int j = size; j >= i; j--) 
      array[j + 1] = array[j]; 
     array[i] = value; 
     size++; 
    } 

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

    public E reverse() { 

     Collections.reverse(array); 

    } 

} 
+0

Там нет метода на [ 'Collections'] (https://docs.oracle.com/javase/8/docs/api/java/util /Collections.html), который принимает аргумент массива ... – dcsohl

ответ

0

Если вы имеете в виду, что вы хотите сделать это вручную, без использования Collections.reverse (этот код не должен даже скомпилировать кстати, нуждается в обратной List в качестве параметра), просто пройти через массив от начала до элементов среднего обменивать на противоположных сторонах диапазона:

public E[] reverse() { 
    for (int i = 0; i < size/2; i++){ 
     E tmp=array[i]; 
     array[i] = array[size - i - 1]; 
     array[size - i - 1]=tmp; 
    } 
    return array; // If you really want to return it 
} 

Более подробную информацию о in situ algorithms на википедии.

Что касается в add реализации, гарантирует, что имеется достаточно места:

public void add(E value) { 
    int newsize=size+1; 
    if(newsize<size){ 
     //The array is big enough, add the element 
     array[newsize]=value; 
    }else{ 
     //The array is too small, create a new one with 
     //the old content but twice as bigger and add 
     //the new element 
     array=Arrays.copyOf(array,size*2); 
     array[newsize]=value; 
    } 
    size=newsize; 
} 
+0

, поэтому я предполагаю, что это будет считаться «in situ» без использования дополнительного массива элементов и использования только операций свопинга. – atomcascade

+0

Да, «in situ» является латинским для «на месте», что 3 строки выполняют своп. –

+0

о! Я думал, что «in situ» означает что-то особенное в программировании и на Java. – atomcascade

0

Collections.reverse() делает разворот "на месте"; Вам просто нужно дать ему массив в виде списка:

Collections.reverse(Arrays.asList(array)); 
+0

Спасибо! прямо сейчас, если вы посмотрите на то, что Uraimo и я говорили о том, что я пытаюсь «исправить метод add(), чтобы увеличить размер хранимого массива, потому что добавление элемента при заполнении массива больше невозможно.Также исправьте метод insert(), чтобы увеличить размер хранимого массива, потому что вставка элемента при заполнении массива больше невозможна " – atomcascade

Смежные вопросы