向右移动数组 - 作业

5

这是我目前的代码,但当我运行它时,出现了Java版本不匹配的错误。 这是我的数组:

char[] letters = {'A', 'B' , 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};


/********************************************************************************
    shiftRight() will move the contents of the array one slot to the right
********************************************************************************/
public static void shiftRight( char [] letters )
{
    char last = letters[letters.length-1];          // save off first element

    // shift right
    for( int index =letters.length-1; index >= 0 ; index-- )
        letters[index+1] = letters [index];

    // wrap last element into first slot
    letters[0] = last;
    System.out.print("\nshifted Array: " );
}

我必须将所有内容向右移动。最后一个字符必须重新输入到letters [0]中。 - javip
请使用println()代替print(\n)。 - Mik378
6个回答

12

你可以像这样做:

 public static void shiftRight( char [] letters )
    {

        char last = letters[letters.length-1];          // save off first element

        // shift right
        for( int index =letters.length-2; index >= 0 ; index-- )
            letters[index+1] = letters [index];

        // wrap last element into first slot
        letters[0] = last;
        System.out.print("\nshifted Array: " + Arrays.toString(letters) );

    }

我只修改了你的:letters.length-1letters.length-2 并打印了数组。

另一种更简单的方法是使用System.arraycopy,如下:

last = letters[letters.length-1];
System.arraycopy(letters, 0, letters, 1, letters.length-1 );
letters[0] = last;

你也可以使用以下方法打印数组:

System.out.print("{");
for (int i=0;i<letters.length-1;i++)
    System.out.print("'"+letters[i]+",");
System.out.println("'"+letters[letters.length-1]+"'}");

“-2” 是做什么的?将nd数组转换为字符串有什么作用? - javip
@javip 你正在运行哪个Java版本?还有什么错误信息?Arrays.toString应该从1.5(Java 5)开始可用。 - dan
@javip 你需要使用:Arrays.toString(letters) 而非 letters.toString(letters)。Arrays 是一个能够处理数组的类。 - dan
H:\我的文档\ArrayLab.java:134: 错误: 无法将类Object中的方法toString应用到给定类型; System.out.print("\n移位后的数组: " + Arrays.toString(letters) ); ^ 需要: 无参数 找到: char[] 原因: 实际参数列表和形式参数列表长度不同 1个错误工具以退出码1完成 - javip
@javip,char[] lettersletters是一样的吗?这是在同一个shiftRight函数中发生的吗?并且你已经导入了java.util.Arrays吗? - dan
显示剩余5条评论

2

当在for循环中第一次执行letters[index+1]时(当index = letters.length-1时),它指向的是letters[letters.length],这不是一个有效的索引,因为索引从0length-1

更新您的for循环,将indexletters.length-2开始,并确保您的array.length>1。也就是说:

   if(letters.length > 1){ //make sure array has minimum two elements
      // shift right
      for( int index = letters.length-2; index >= 0 ; index-- ){
          letters[index+1] = letters [index];
      }
   }

最终,您可以将数组打印为:
   System.out.println("Shifted Array: " +letters); 

编辑:示例工作代码。

如果您将数组设置为 Character 数组,例如在您的 main 中,如下所示(仅用于打印辅助)

    Character[] letters = {'A', 'B' , 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};

然后将更新后的代码传递给shiftRight方法,如下所示:

  public static void shiftRight( Character [] letters )
  {
    Character last = letters[letters.length-1];  
    if(letters.length >1){ //make sure array has minimum two elements
        // shift right
        for( int index =letters.length-2; index >= 0 ; index-- ){
            letters[index+1] = letters [index];
        }
     }
    letters[0] = last;
    System.out.println(Arrays.toString(letters));
    //^ prints: Shifted Array: [J, A, B, C, D, E, F, G, H, I]
  }

你应该已经准备好了。


字符数组letters包含{'A', 'B' , 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}这几个元素。输出的内容为[C@eb017e。 - javip
@javip:我使用了我的答案中的示例代码,并打印出 Shifted Array: JABCDEFGHI。尝试逐个字符打印,如下所示:for(char c: letters){ System.out.println(String.valueOf(c));} - Yogendra Singh
打印输出应该像这样:'J','A','B','C','D','E','F','G','I'。 - javip
@javip:我已更新答案。请检查是否有帮助。如果你不喜欢使用Character[],那么我认为你需要手动按所需格式打印结果。请注意:我正在使用Java 7。你用的是哪个版本? - Yogendra Singh
H:\我的文档\ArrayLab.java:130: 错误: 找不到符号 System.out.println(Arrays.asList(letters)); ^ 符号: 方法 asList(char[]) 位置: 类 Arrays 1 个错误工具以退出代码1完成。 - javip
显示剩余9条评论

0

添加

     if(index<letters.length-1)  condition 

在你的for循环之前

 letters[index+1] = letters [index]

如果你不检查 if(index<letters.length-1) 条件,你会在这里的最后一个索引处得到 ArrayIndexOutOfBounds 异常:letters[index+1] = letters [index]


0

实际上,在循环中想要读取时,会立即出现ArrayIndexOutOfBoundsException

letters[index+1]

原因是您的index变量初始化:index = letters.length-1 所以,letters[index+1] == letters[letters.length] 但逻辑上 letters.length 导致了 ArrayIndexOutOfBoundsException
在不改变逻辑的情况下纠正代码的简单方法:
for(int index = letters.length-1; index > 0 ; index--)
   letters[index] = letters [index-1];

请注意运算符使用 > 而不是 >=。否则,这也会导致相同的 异常
此外,为了显示最终的数组,请使用:Arrays.toString(letters)
我甚至按照您的逻辑编写了我的解决方案。
public static void main(String[] args) {
    char[] letters = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
    printShiftedLetters(shiftElementsToRight(letters));
}

public static char[] shiftElementsToRight(char[] array) {
    if (array == null) {
        throw new NullPointerException("array must not be null");
    }
    if(array.length <= 1){
        return array;
    }
    char[] shiftedArray = new char[array.length];
    char lastElement = array[array.length - 1];
    for (int i = array.length - 1; i > 0; i--) {
        shiftedArray[i] = array[i - 1];
    }
    shiftedArray[0] = lastElement;
    return shiftedArray;
}

private static void printShiftedLetters(char[] shiftedLetters) {
    System.out.println(Arrays.toString(shiftedLetters));
}

@javip 这正是你所期望的吗? - Mik378

0

以下解决方案对我有效。

   public void rightShiftArray(int[] arr, int n){
        int[] output=new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            int newLocation = (i+(arr.length+n))%arr.length;
            output[newLocation] = arr[i];
        }
        for (int i = 0; i < output.length; i++) {
            System.out.print(output[i]+",");
        }
    }

arr -> 待移位的数组 n -> 将元素向右移动多少个位置。


0

针对整数值

您可以针对整数值执行以下操作:

public static void main(String[] args) {
    int arr[] = {1,2,3,4,5};
    arrayReorder(arr,25);
}



private static void arrayReorder(int[] arr, int repeat) {
    int count = 0;
    int length = arr.length;
    int end = 0;
    int traversedArray[] = new int[length];

    while (count < repeat) {
        end = arr[length-1];
        for (int i = 1; i < length; i++) {
            traversedArray[i] = arr[i-1];
            traversedArray[0] = end;
        }
        System.out.println();
        for (int a : traversedArray) {
            System.out.print(a + " -> ");
        }
        arr = traversedArray.clone();
        count++;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接