我正在尝试反转 Java 中的 int 数组。
此方法不会反转数组。
for(int i = 0; i < validData.length; i++)
{
int temp = validData[i];
validData[i] = validData[validData.length - i - 1];
validData[validData.length - i - 1] = temp;
}
它有什么问题?
要反转 int 数组,您需要交换项目直到到达中点,如下所示:
for(int i = 0; i < validData.length / 2; i++)
{
int temp = validData[i];
validData[i] = validData[validData.length - i - 1];
validData[validData.length - i - 1] = temp;
}
你这样做的方式,你交换每个元素两次,所以结果与初始列表相同。
使用 Commons.Lang,您可以简单地使用
ArrayUtils.reverse(int[] array)
大多数情况下,在解决您的问题时,坚持使用已经过单元测试和用户测试的易于使用的库会更快、更安全。
private int[] reversed(int[] array) {ArrayUtils.reverse(array);}
然后你可以做 f(reversed(arr));
:))
Collections.reverse(Arrays.asList(yourArray));
java.util.Collections.reverse()
可以反转 java.util.List
并且 java.util.Arrays.asList()
返回一个包含您传递给它的特定数组的列表,因此在调用 Collections.reverse()
之后 yourArray
被反转。
成本只是创建一个列表对象,不需要额外的库。
Tarik 及其评论者的回答中提出了类似的解决方案,但我认为这个答案会更简洁,更容易解析。
int[]
传递给 asList(...)
不会返回 List<Integer>
,而是返回包含一个元素的 List<int[]>
。 AFAICS 没有将 int[]
转换为 Integer[]
的简单内置方法。
Arrays.stream(arr).boxed().collect(Collectors.toList())
或 Arrays.stream(arr).boxed().toArray(Integer[]::new)
public class ArrayHandle {
public static Object[] reverse(Object[] arr) {
List<Object> list = Arrays.asList(arr);
Collections.reverse(list);
return list.toArray();
}
}
int
)都被包装到它们各自的包装器(在本例中为 Integer
)并放入列表中。你看,Integer
是对象。 @汤姆
int[]
与 Integer[]
不同。试试看:Integer[] array = new int[5]
。你会得到一个编译错误。这就是为什么 Java Arrays
类定义了一组处理原始数组的方法。尝试将 int[]
传递给上述方法将产生类似 The method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[])
的结果。 @Filip - 就地算法使用更少的内存并且运行得更快。
Arrays.asList()
返回的列表没有引用原始数组,返回的数组也没有。这是这种方法的问题之一:它使用了三倍的内存,并且作为就地算法将工作量增加了三倍。
int[]
作为参数传递给此方法(“不兼容的类型:int[] 无法转换为 Object[]”)。
如果您声明显式变量以跟踪您在循环的每次迭代中交换的索引,我认为遵循算法的逻辑会更容易一些。
public static void reverse(int[] data) {
for (int left = 0, right = data.length - 1; left < right; left++, right--) {
// swap the values at the left and right indices
int temp = data[left];
data[left] = data[right];
data[right] = temp;
}
}
我还认为在 while 循环中执行此操作更具可读性。
public static void reverse(int[] data) {
int left = 0;
int right = data.length - 1;
while( left < right ) {
// swap the values at the left and right indices
int temp = data[left];
data[left] = data[right];
data[right] = temp;
// move the left and right index pointers in toward the center
left++;
right--;
}
}
这里已经有很多答案,主要集中在就地修改数组。但是为了完整起见,这里是另一种使用 Java 流来保留原始数组并创建一个新的反转数组的方法:
int[] a = {8, 6, 7, 5, 3, 0, 9};
int[] b = IntStream.rangeClosed(1, a.length).map(i -> a[a.length-i]).toArray();
对于 Java 8,我们还可以使用 IntStream
将整数数组反转为:
int[] sample = new int[]{1,2,3,4,5};
int size = sample.length;
int[] reverseSample = IntStream.range(0,size).map(i -> sample[size-i-1])
.toArray(); //Output: [5, 4, 3, 2, 1]
与番石榴:
Collections.reverse(Ints.asList(array));
asList
方法一样,它创建一个直接写入支持(原始)数组的 view。我认为这里的投票者错误地认为这会返回一个装箱列表或其他东西。
Collections.reverse
是一个 void 方法。这在包装 int[]
的 Guava 内部类上就地运行(由于它从不存储盒装 Integer
的列表,我不会将该类称为“盒装列表”,而是称为“列表视图”大批”)。但是是的,它通过传递 Integer
对象的接口进行操作,所以这会产生很多临时对象流失和装箱,如前所述。在性能很重要的地方尝试使用 IntStream
或原始集合库。 (Trove,Koloboke,Eclipse Collections,...)
for(int i=validData.length-1; i>=0; i--){
System.out.println(validData[i]);
}
简单的for循环!
for (int start = 0, end = array.length - 1; start <= end; start++, end--) {
int aux = array[start];
array[start]=array[end];
array[end]=aux;
}
start <= end
更改为 start < end
这将帮助你
int a[] = {1,2,3,4,5};
for (int k = 0; k < a.length/2; k++) {
int temp = a[k];
a[k] = a[a.length-(1+k)];
a[a.length-(1+k)] = temp;
}
这就是我个人解决的方法。创建参数化方法的原因是允许对任何数组进行排序......而不仅仅是您的整数。
我希望你能从中有所收获。
@Test
public void reverseTest(){
Integer[] ints = { 1, 2, 3, 4 };
Integer[] reversedInts = reverse(ints);
assert ints[0].equals(reversedInts[3]);
assert ints[1].equals(reversedInts[2]);
assert ints[2].equals(reversedInts[1]);
assert ints[3].equals(reversedInts[0]);
reverseInPlace(reversedInts);
assert ints[0].equals(reversedInts[0]);
}
@SuppressWarnings("unchecked")
private static <T> T[] reverse(T[] array) {
if (array == null) {
return (T[]) new ArrayList<T>().toArray();
}
List<T> copyOfArray = Arrays.asList(Arrays.copyOf(array, array.length));
Collections.reverse(copyOfArray);
return copyOfArray.toArray(array);
}
private static <T> T[] reverseInPlace(T[] array) {
if(array == null) {
// didn't want two unchecked suppressions
return reverse(array);
}
Collections.reverse(Arrays.asList(array));
return array;
}
Collections.reverse(asList(arraytoReverse)); return arrayToReverse;
。 asList
只是数组的一个包装器,因此原始数组是相反的。
如果使用更原始的数据(即 char、byte、int 等),那么您可以进行一些有趣的 XOR 操作。
public static void reverseArray4(int[] array) {
int len = array.length;
for (int i = 0; i < len/2; i++) {
array[i] = array[i] ^ array[len - i - 1];
array[len - i - 1] = array[i] ^ array[len - i - 1];
array[i] = array[i] ^ array[len - i - 1];
}
}
您的程序仅适用于 length = 0, 1
。你可以试试 :
int i = 0, j = validData.length-1 ;
while(i < j)
{
swap(validData, i++, j--); // code for swap not shown, but easy enough
}
有两种方法可以解决该问题:
1. 在空间中反转一个数组。
步骤 1. 交换开始和结束索引处的元素。
步骤 2. 增加起始索引减少结束索引。
Step 3. 迭代 Step 1 和 Step 2 直到开始索引 < 结束索引
为此,时间复杂度为 O(n),空间复杂度为 O(1)
在空间中反转数组的示例代码如下:
public static int[] reverseAnArrayInSpace(int[] array) {
int startIndex = 0;
int endIndex = array.length - 1;
while(startIndex < endIndex) {
int temp = array[endIndex];
array[endIndex] = array[startIndex];
array[startIndex] = temp;
startIndex++;
endIndex--;
}
return array;
}
2. 使用辅助数组反转数组。
步骤 1. 创建一个大小等于给定数组的新数组。
步骤 2. 从起始索引开始,从给定数组从结束索引开始,将元素插入新数组。
为此,时间复杂度为 O(n),空间复杂度为 O(n)
使用辅助数组反转数组的示例代码如下:
public static int[] reverseAnArrayWithAuxiliaryArray(int[] array) {
int[] reversedArray = new int[array.length];
for(int index = 0; index < array.length; index++) {
reversedArray[index] = array[array.length - index -1];
}
return reversedArray;
}
此外,我们可以使用 Java 中的 Collections API 来执行此操作。
Collections API 在内部使用相同的空间反向方法。
使用 Collections API 的示例代码如下:
public static Integer[] reverseAnArrayWithCollections(Integer[] array) {
List<Integer> arrayList = Arrays.asList(array);
Collections.reverse(arrayList);
return arrayList.toArray(array);
}
上面有一些很好的答案,但这就是我的做法:
public static int[] test(int[] arr) {
int[] output = arr.clone();
for (int i = arr.length - 1; i > -1; i--) {
output[i] = arr[arr.length - i - 1];
}
return output;
}
简单地向后迭代数组是最有效的。
我不确定 Aaron 的解决方案是否可以通过此调用 Collections.reverse(list);
有人知道吗?
public void getDSCSort(int[] data){
for (int left = 0, right = data.length - 1; left < right; left++, right--){
// swap the values at the left and right indices
int temp = data[left];
data[left] = data[right];
data[right] = temp;
}
}
具有 o(n) 时间复杂度和 o(1) 空间复杂度的解。
void reverse(int[] array) {
int start = 0;
int end = array.length - 1;
while (start < end) {
int temp = array[start];
array[start] = array[end];
array[end] = temp;
start++;
end--;
}
}
for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }
。
public void display(){
String x[]=new String [5];
for(int i = 4 ; i > = 0 ; i-- ){//runs backwards
//i is the nums running backwards therefore its printing from
//highest element to the lowest(ie the back of the array to the front) as i decrements
System.out.println(x[i]);
}
}
这样做不会更不可能出错吗?
int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] temp = new int[intArray.length];
for(int i = intArray.length - 1; i > -1; i --){
temp[intArray.length - i -1] = intArray[i];
}
intArray = temp;
使用 XOR 解决方案来避免临时变量,您的代码应该看起来像
for(int i = 0; i < validData.length; i++){
validData[i] = validData[i] ^ validData[validData.length - i - 1];
validData[validData.length - i - 1] = validData[i] ^ validData[validData.length - i - 1];
validData[i] = validData[i] ^ validData[validData.length - i - 1];
}
请参阅此链接以获得更好的解释:
http://betterexplained.com/articles/swap-two-variables-using-xor/
2 种反转 Array 的方法。
使用 For 循环并交换元素直到中点,时间复杂度为 O(n/2)。 private static void reverseArray() { int[] array = new int[] { 1, 2, 3, 4, 5, 6 }; for (int i = 0; i < array.length / 2; i++) { int temp = array[i]; int index = array.length - i - 1;数组[i] = 数组[索引];数组[索引] = 温度; } System.out.println(Arrays.toString(array)); } 使用内置函数 (Collections.reverse()) private static void reverseArrayUsingBuiltInFun() { int[] array = new int[] { 1, 2, 3, 4, 5, 6 }; Collections.reverse(Ints.asList(array)); System.out.println(Arrays.toString(array));输出:[6,5,4,3,2,1]
Ints
是什么?
public static void main(String args[]) {
int [] arr = {10, 20, 30, 40, 50};
reverse(arr, arr.length);
}
private static void reverse(int[] arr, int length) {
for(int i=length;i>0;i--) {
System.out.println(arr[i-1]);
}
}
下面是在您的机器上运行的完整程序。
public class ReverseArray {
public static void main(String[] args) {
int arr[] = new int[] { 10,20,30,50,70 };
System.out.println("reversing an array:");
for(int i = 0; i < arr.length / 2; i++){
int temp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
对于使用数组 this will be the good source 的矩阵程序。通过链接。
private static int[] reverse(int[] array){
int[] reversedArray = new int[array.length];
for(int i = 0; i < array.length; i++){
reversedArray[i] = array[array.length - i - 1];
}
return reversedArray;
}
这是一个简单的实现,用于反转任何类型的数组,以及完全/部分支持。
import java.util.logging.Logger;
public final class ArrayReverser {
private static final Logger LOGGER = Logger.getLogger(ArrayReverser.class.getName());
private ArrayReverser () {
}
public static <T> void reverse(T[] seed) {
reverse(seed, 0, seed.length);
}
public static <T> void reverse(T[] seed, int startIndexInclusive, int endIndexExclusive) {
if (seed == null || seed.length == 0) {
LOGGER.warning("Nothing to rotate");
}
int start = startIndexInclusive < 0 ? 0 : startIndexInclusive;
int end = Math.min(seed.length, endIndexExclusive) - 1;
while (start < end) {
swap(seed, start, end);
start++;
end--;
}
}
private static <T> void swap(T[] seed, int start, int end) {
T temp = seed[start];
seed[start] = seed[end];
seed[end] = temp;
}
}
这是对应的单元测试
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
public class ArrayReverserTest {
private Integer[] seed;
@Before
public void doBeforeEachTestCase() {
this.seed = new Integer[]{1,2,3,4,5,6,7,8};
}
@Test
public void wholeArrayReverse() {
ArrayReverser.<Integer>reverse(seed);
assertThat(seed[0], is(8));
}
@Test
public void partialArrayReverse() {
ArrayReverser.<Integer>reverse(seed, 1, 5);
assertThat(seed[1], is(5));
}
}
这是我想出的:
// solution 1 - boiler plated
Integer[] original = {100, 200, 300, 400};
Integer[] reverse = new Integer[original.length];
int lastIdx = original.length -1;
int startIdx = 0;
for (int endIdx = lastIdx; endIdx >= 0; endIdx--, startIdx++)
reverse[startIdx] = original[endIdx];
System.out.printf("reverse form: %s", Arrays.toString(reverse));
// solution 2 - abstracted
// convert to list then use Collections static reverse()
List<Integer> l = Arrays.asList(original);
Collections.reverse(l);
System.out.printf("reverse form: %s", l);
static int[] reverseArray(int[] a) {
int ret[] = new int[a.length];
for(int i=0, j=a.length-1; i<a.length && j>=0; i++, j--)
ret[i] = a[j];
return ret;
}
public static int[] reverse(int[] array) {
int j = array.length-1;
// swap the values at the left and right indices //////
for(int i=0; i<=j; i++)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
j--;
}
return array;
}
public static void main(String []args){
int[] data = {1,2,3,4,5,6,7,8,9};
reverse(data);
}
不定期副业成功案例分享
validData.length / 2
部分放在 for 循环的外部。validData.length >> 1
。这是等效的并且更快,但它使许多程序员感到困惑,任何好的编译器都会自动做到这一点。validData.length - i - 1
并将其保存到变量中。