我有一个 Java 对象数组,我试图将一个元素拉到顶部,并将其余元素向下移动一个。
假设我有一个大小为 10 的数组,并且我正在尝试提取第五个元素。第五个元素进入位置
0
,所有从 0 到 5 的元素将向下移动 1。
该算法无法正确移动元素:
Object temp = pool[position];
for (int i = 0; i < position; i++) {
array[i+1] = array[i];
}
array[0] = temp;
我该如何正确做?
逻辑上它不起作用,你应该反转你的循环:
for (int i = position-1; i >= 0; i--) {
array[i+1] = array[i];
}
您也可以使用
System.arraycopy(array, 0, array, 1, position);
假设您的数组是 {10,20,30,40,50,60,70,80,90,100}
你的循环的作用是:
迭代 1: array[1] = array[0]; {10,10,30,40,50,60,70,80,90,100}
迭代 2: array[2] = array[1]; {10,10,10,40,50,60,70,80,90,100}
你应该做的是
Object temp = pool[position];
for (int i = (position - 1); i >= 0; i--) {
array[i+1] = array[i];
}
array[0] = temp;
您可以使用
Collections.rotate(List<?> list, int distance)
使用
Arrays.asList(array)
转换为 List
更多信息:https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#rotate(java.util.List,%20int)
您可以使用这样的模块使此功能更加通用,而不是移动一个位置。
int[] original = { 1, 2, 3, 4, 5, 6 };
int[] reordered = new int[original.length];
int shift = 1;
for(int i=0; i<original.length;i++)
reordered[i] = original[(shift+i)%original.length];
正如您所发现的,以这种方式操作数组很容易出错。更好的选择可能是在您的情况下使用LinkedList。对于链表和所有 Java 集合,数组管理是在内部处理的,因此您不必担心元素的移动。使用 LinkedList,您只需调用
remove
,然后调用 addLast
,就完成了。
试试这个:
Object temp = pool[position];
for (int i = position-1; i >= 0; i--) {
array[i+1] = array[i];
}
array[0] = temp;
在这里查看它的工作原理:http://www.ideone.com/5JfAg
使用数组复制 k 次移位 k=1 或 k=3 等的通用解决方案
public void rotate(int[] nums, int k) {
// Step 1
// k > array length then we dont need to shift k times because when we shift
// array length times then the array will go back to intial position.
// so we can just do only k%array length times.
// change k = k% array.length;
if (k > nums.length) {
k = k % nums.length;
}
// Step 2;
// initialize temporary array with same length of input array.
// copy items from input array starting from array length -k as source till
// array end and place in new array starting from index 0;
int[] tempArray = new int[nums.length];
System.arraycopy(nums, nums.length - k, tempArray, 0, k);
// step3:
// loop and copy all the remaining elements till array length -k index and copy
// in result array starting from position k
for (int i = 0; i < nums.length - k; i++) {
tempArray[k + i] = nums[i];
}
// step 4 copy temp array to input array since our goal is to change input
// array.
System.arraycopy(tempArray, 0, nums, 0, tempArray.length);
}
代码
public void rotate(int[] nums, int k) {
if (k > nums.length) {
k = k % nums.length;
}
int[] tempArray = new int[nums.length];
System.arraycopy(nums, nums.length - k, tempArray, 0, k);
for (int i = 0; i < nums.length - k; i++) {
tempArray[k + i] = nums[i];
}
System.arraycopy(tempArray, 0, nums, 0, tempArray.length);
}
在循环的第一次迭代中,您覆盖
array[1]
中的值。 您应该以相反的顺序查看索引。
static void pushZerosToEnd(int arr[])
{ int n = arr.length;
int count = 0; // Count of non-zero elements
// Traverse the array. If element encountered is non-zero, then
// replace the element at index 'count' with this element
for (int i = 0; i < n; i++){
if (arr[i] != 0)`enter code here`
// arr[count++] = arr[i]; // here count is incremented
swapNumbers(arr,count++,i);
}
for (int j = 0; j < n; j++){
System.out.print(arr[j]+",");
}
}
public static void swapNumbers(int [] arr, int pos1, int pos2){
int temp = arr[pos2];
arr[pos2] = arr[pos1];
arr[pos1] = temp;
}
如果您将数组数据作为 Java 列表,还有另一种变体
listOfStuff.add(
0,
listOfStuff.remove(listOfStuff.size() - 1) );
只是分享我遇到的另一个选项,但我认为@Murat Mustafin的答案是使用列表的方式
public class Test1 {
public static void main(String[] args) {
int[] x = { 1, 2, 3, 4, 5, 6 };
Test1 test = new Test1();
x = test.shiftArray(x, 2);
for (int i = 0; i < x.length; i++) {
System.out.print(x[i] + " ");
}
}
public int[] pushFirstElementToLast(int[] x, int position) {
int temp = x[0];
for (int i = 0; i < x.length - 1; i++) {
x[i] = x[i + 1];
}
x[x.length - 1] = temp;
return x;
}
public int[] shiftArray(int[] x, int position) {
for (int i = position - 1; i >= 0; i--) {
x = pushFirstElementToLast(x, position);
}
return x;
}
}
对大小为 n 的数组进行左旋转操作会将数组的每个元素单元向左移动,检查一下!!!!!!
public class Solution {
private static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
String[] nd = scanner.nextLine().split(" ");
int n = Integer.parseInt(nd[0]); //no. of elements in the array
int d = Integer.parseInt(nd[1]); //number of left rotations
int[] a = new int[n];
for(int i=0;i<n;i++){
a[i]=scanner.nextInt();
}
Solution s= new Solution();
//number of left rotations
for(int j=0;j<d;j++){
s.rotate(a,n);
}
//print the shifted array
for(int i:a){System.out.print(i+" ");}
}
//shift each elements to the left by one
public static void rotate(int a[],int n){
int temp=a[0];
for(int i=0;i<n;i++){
if(i<n-1){a[i]=a[i+1];}
else{a[i]=temp;}
}}
}
您可以使用以下代码进行平移而不是旋转:
int []arr = {1,2,3,4,5,6,7,8,9,10,11,12};
int n = arr.length;
int d = 3;
将大小为
n
的数组向左移动 d
个元素的程序:
Input : {1,2,3,4,5,6,7,8,9,10,11,12}
Output: {4,5,6,7,8,9,10,11,12,10,11,12}
public void shiftLeft(int []arr,int d,int n) {
for(int i=0;i<n-d;i++) {
arr[i] = arr[i+d];
}
}
将大小为
n
的数组向右移动 d
个元素的程序:
Input : {1,2,3,4,5,6,7,8,9,10,11,12}
Output: {1,2,3,1,2,3,4,5,6,7,8,9}
public void shiftRight(int []arr,int d,int n) {
for(int i=n-1;i>=d;i--) {
arr[i] = arr[i-d];
}
}
Left shift in java using java 8
import java.util.*;
class HelloWorld {
public static void main(String[] args) {
List<String> list= new ArrayList<>();
list.add("akash");
list.add("roopesh");
list.add("rahul");
list.add("anubhav");
System.out.println(list);
int a=2;
if(a<=list.size()){
List<String> resList= new ArrayList<>();
for(int i=0; i<list.size();i++){
if(i<list.size()-a){
resList.add(list.get(i+a));
}else if(i<list.size()){
System.out.println(-(list.size()-(i)-a));
resList.add(list.get(-(list.size()-(i)-a)));
}
}
System.out.println(resList);
}else{
System.out.println("Shift value should be less than array size");
}
}
}
import java.util.Scanner;
public class Shift {
public static void main(String[] args) {
Scanner input = new Scanner (System.in);
int array[] = new int [5];
int array1[] = new int [5];
int i, temp;
for (i=0; i<5; i++) {
System.out.printf("Enter array[%d]: \n", i);
array[i] = input.nextInt(); //Taking input in the array
}
System.out.println("\nEntered datas are: \n");
for (i=0; i<5; i++) {
System.out.printf("array[%d] = %d\n", i, array[i]); //This will show the data you entered (Not the shifting one)
}
temp = array[4]; //We declared the variable "temp" and put the last number of the array there...
System.out.println("\nAfter Shifting: \n");
for(i=3; i>=0; i--) {
array1[i+1] = array[i]; //New array is "array1" & Old array is "array". When array[4] then the value of array[3] will be assigned in it and this goes on..
array1[0] = temp; //Finally the value of last array which was assigned in temp goes to the first of the new array
}
for (i=0; i<5; i++) {
System.out.printf("array[%d] = %d\n", i, array1[i]);
}
input.close();
}
}
编写一个Java程序创建一个20个整数的数组,然后实现将数组右移两个元素的过程。
public class NewClass3 {
public static void main (String args[]){
int a [] = {1,2,};
int temp ;
for(int i = 0; i<a.length -1; i++){
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
for(int p : a)
System.out.print(p);
}
}