我正在尝试编写一个接收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;
}
答案 0 :(得分:0)
moveToRightOne
不会复制您传入的names
数组。而是直接修改它。这意味着当你说
String[] NewNames = moveToRightOne(names1, firstPosition, firstPosition+1);
字符串将在names1
中移位,之后,NewNames
和names1
将只是对同一数组的引用。我认为你的意图是让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
是否正确? (如果firstPosition
为0
,则不会发生任何更改,因为for
循环不会执行)
快速思考:
如果您正在寻找手动排序(我假设这是一个类)。我还假设您正在尝试实施插入排序算法(否则Arrays.sort()是您的朋友)。你接近它的方式,看起来你将通过数组进行多次传递以实现排序。如果你想这样做,改用冒泡排序。
插入排序代码的说明如下所示:
开始循环遍历数组,比较 index 处的元素是否大于 index + 1 处的元素。如果不是真的移动到下一个元素。 if true将较小的元素(称为 A )与之前的所有元素进行比较,直到它大于下一个前一个元素(让我们称之为 B )。保存 A 的副本,将 B 之后的所有元素向右移动(按1),直到转到 A 的旧位置。在 B 之后插入 A 的副本。从旧的 A 索引继续。冲洗/重复直到阵列结束
在这种情况下,您可能希望简化代码(并始终检查0
和Array.length
等边缘条件
HTH