Java 数组中的移动索引

Java 数组中的移动索引,java,arrays,shift,Java,Arrays,Shift,我正在尝试编写一个程序,该程序接收字符串[],并按字母顺序首先打印出第一个字符串的数组。我必须使用三种类似的方法。以下是一个输入/输出示例: bob, joe, aaron, zack ----> aaron, bob, joe, zack findFirstName按字母顺序正确查找第一个字符串并返回其位置。 MoveToRightOne在按字母顺序覆盖第一个字符串并重复第一个字符串(例如:bob joe zack)的同时正确地将每个字符串右移一位。 moveName工作不正常。它

我正在尝试编写一个程序,该程序接收字符串[],并按字母顺序首先打印出第一个字符串的数组。我必须使用三种类似的方法。以下是一个输入/输出示例:

bob, joe, aaron, zack   ----> aaron, bob, joe, zack
findFirstName按字母顺序正确查找第一个字符串并返回其位置。 MoveToRightOne在按字母顺序覆盖第一个字符串并重复第一个字符串(例如:bob joe zack)的同时正确地将每个字符串右移一位。 moveName工作不正常。它应该用aaron替换bob的第一个实例,但通常会偏离一到两个位置。 有人知道为什么moveOne会发生这种情况吗

moveToRightOne不会复制传入的名称数组。相反,它直接修改它。这意味着当你说

String[] NewNames = moveToRightOne(names1, firstPosition, firstPosition+1);
字符串将在names1中移位,之后,NewNames和names1将只是对同一数组的引用。我认为您的目的是使NewNames成为一个字符串移位的数组,而不使用names1,但实际情况并非如此。这意味着以下语句将返回错误的字符串:

String firstAlph=  names1 [firstPosition];
或者,由于names1已经是名称的克隆,当您试图从尚未移位的数组中访问元素时,可能需要使用名称而不是names1。

您的moveToRightOne函数已中断,因此您实际上没有使用传入的所有参数。此外,在使用该函数覆盖名字之前,应该按字母顺序获取名字

public class Shift {
    public static void moveName(String [] names) {
        int firstPosition = findFirstName(names);

        // Store the name at that position
        String firstName = names[firstPosition];
        moveToRightOne(names, 0, firstPosition);
        names [0] = firstName;
    }
    public static int findFirstName(String[] names1) {
        // receives an array of Strings, and returns the location (i.e. index)
        // of the first name (alphabetically)

        String first=names1[0];
        int firstPosition = 0;

        for (int i=0; i<names1.length; i++) {
            int result =names1[i].compareToIgnoreCase(first);

            if (result < 0) {
                first= names1[i];
                firstPosition = i;
            }
        }

        return firstPosition;
    }
    public static void moveToRightOne (String[] names, int startSpot,  int  endSpot) {
        for (int i = (endSpot - 1); i >= startSpot; i--) {                
            names[i+1] = names[i];
        }
    }
    public static void main(String[] args) { 
        String[] original = new String[] { "bob", "joe", "aaron", "zac"};
        for (String s: original) System.out.println(s);
        System.out.println();
        moveName(original);
        for (String s: original) System.out.println(s);
    }
}

请改用Arrays.sort进行排序。这不是问题的确切解决方案,而是另一种解决方法

import java.util.Arrays;
public class Test{
Public static void main(String args[]){
  String str[]= {'Mike','Adam','Peter','Brian'};
  System.out.println("str"+str[0]); // Mike
  Arrays.sort(str);
  System.out.println("str"+str[0]); //Adam
  }  
}
你确定moveToRightOne是正确的吗?如果firstPosition为0,则不会得到任何更改,因为for循环将不会执行

想一想:

如果你想手动排序,我想这是一个类。我还假设您正在尝试实现插入排序算法,否则Arrays.sort是您的朋友。按照您接近它的方式,看起来您将多次通过数组来实现排序。如果您想这样做,请切换到冒泡排序

插入排序代码的描述如下所示:

开始在数组中循环,比较索引处的元素是否大于索引+1处的元素。如果不是true,则移动到下一个元素。如果为true,则将较小的元素称为A与所有先前的元素进行比较,直到它大于下一个先前的元素。让我们将其称为B。将B之后的所有元素向右移动1,直到到达A的旧位置。将A的副本插入B之后的位置。从旧A的索引继续。冲洗/重复,直到阵列结束

在这种情况下,您可能希望简化代码,并始终检查边缘条件,如0和Array.length


HTH

请提供一个最低限度的工作示例,在该示例中,您实际调用代码并得到错误的结果。在编写时,您的代码采用参数,而您的文字描述的是值,因此有点难以理解。例如,如果我输入bob,joe,aaron,zack,它将返回joe,bob,joe,zack。为了清晰起见,请还包括所需的输出。所需的输出是aaron,bob,joe,zack。您存储了名字的位置,移动数组,使该位置无效。存储实际名称。我建议在您的答案上添加一些额外的解释。OA花时间写他们的问题。也许你可以澄清并扩大你的回答?
String firstAlph=  names1 [firstPosition];
public class Shift {
    public static void moveName(String [] names) {
        int firstPosition = findFirstName(names);

        // Store the name at that position
        String firstName = names[firstPosition];
        moveToRightOne(names, 0, firstPosition);
        names [0] = firstName;
    }
    public static int findFirstName(String[] names1) {
        // receives an array of Strings, and returns the location (i.e. index)
        // of the first name (alphabetically)

        String first=names1[0];
        int firstPosition = 0;

        for (int i=0; i<names1.length; i++) {
            int result =names1[i].compareToIgnoreCase(first);

            if (result < 0) {
                first= names1[i];
                firstPosition = i;
            }
        }

        return firstPosition;
    }
    public static void moveToRightOne (String[] names, int startSpot,  int  endSpot) {
        for (int i = (endSpot - 1); i >= startSpot; i--) {                
            names[i+1] = names[i];
        }
    }
    public static void main(String[] args) { 
        String[] original = new String[] { "bob", "joe", "aaron", "zac"};
        for (String s: original) System.out.println(s);
        System.out.println();
        moveName(original);
        for (String s: original) System.out.println(s);
    }
}
import java.util.Arrays;
public class Test{
Public static void main(String args[]){
  String str[]= {'Mike','Adam','Peter','Brian'};
  System.out.println("str"+str[0]); // Mike
  Arrays.sort(str);
  System.out.println("str"+str[0]); //Adam
  }  
}