移动数组中的索引

时间:2014-11-02 00:49:43

标签: java arrays shift

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

bob, joe, aaron, zack   ----> aaron, bob, joe, zack
  • findFirstName()按字母顺序正确查找第一个String并返回其位置。
  • MoveToRightOne正确地将每个String正确移位,同时按字母顺序覆盖第一个字符串并重复第一个字符串(例如:bob bob joe zack)。
  • moveName()无效。它应该用“aaron”代替“bob”的第一个例子,但通常会被一两个地方取消。

有谁知道为什么moveOne()会发生这种情况?

public static String [] moveName(String [] names) {
    String names1 [] = names.clone();   
    int firstPosition = findFirstName(names1);
    String[] NewNames = moveToRightOne(names1, firstPosition, firstPosition+1);
    String firstAlph=  names1 [firstPosition];
    System.out.println(names1 [firstPosition]);
    NewNames [0] = firstAlph;

    return NewNames;
}

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 String[] moveToRightOne (String[] names, int startSpot,  int  endSpot) {
    for (int i = (startSpot - 1); i >= 0; i--) {                
        names[i+1] = names[i];
    }

    return names;
}

4 个答案:

答案 0 :(得分:0)

moveToRightOne不会复制您传入的names数组。而是直接修改它。这意味着当你说

String[] NewNames = moveToRightOne(names1, firstPosition, firstPosition+1);

字符串将在names1中移位,之后,NewNamesnames1将只是对同一数组的引用。我认为你的意图是让NewNames成为一个变换字符串的数组,并单独留下names1,但这不是正在发生的事情。这意味着以下语句将返回错误的字符串:

String firstAlph=  names1 [firstPosition];

(或者,由于names1已经是names的克隆,因此在尝试访问来自非names的内容时,您可能希望使用names1代替{{1}} -yet-shifted array。)

答案 1 :(得分:0)

您的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);
    }
}

答案 2 :(得分:0)

请使用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
  }  
}

答案 3 :(得分:0)

您确定moveToRightOne是否正确? (如果firstPosition0,则不会发生任何更改,因为for循环不会执行)

快速思考:

如果您正在寻找手动排序(我假设这是一个类)。我还假设您正在尝试实施插入排序算法(否则Arrays.sort()是您的朋友)。你接近它的方式,看起来你将通过数组进行多次传递以实现排序。如果你想这样做,改用冒泡排序

插入排序代码的说明如下所示:

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

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

HTH