使用 "in situ" 反转通用数组
Reversing a Generic Array using "in situ"
对于这个通用数组,我添加了 reverse() 方法,它必须在不使用额外元素数组的情况下反转数组,并且我试图仅使用交换操作来“原位”执行反转。但我可能弄错了,如果是这样,如何仅使用交换操作“原位”逆转它?
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);
}
}
如果你的意思是你想在不使用 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 的更多信息。
关于确保有足够 space 的 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;
}
Collections.reverse()
做反转"in situ";您只需要将数组作为列表提供给它:
Collections.reverse(Arrays.asList(array));
对于这个通用数组,我添加了 reverse() 方法,它必须在不使用额外元素数组的情况下反转数组,并且我试图仅使用交换操作来“原位”执行反转。但我可能弄错了,如果是这样,如何仅使用交换操作“原位”逆转它?
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);
}
}
如果你的意思是你想在不使用 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 的更多信息。
关于确保有足够 space 的 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;
}
Collections.reverse()
做反转"in situ";您只需要将数组作为列表提供给它:
Collections.reverse(Arrays.asList(array));