可能不正确调用 ArrayList 索引?
Possible incorrect calling of ArrayList index?
所以我的这个程序的目标是创建一个方法,它将一个字符串和一个 ArrayList
作为参数,它将字符串添加到 ArrayList
然后按字母顺序排列整个事情和 return 按字母顺序排列的 ArrayList
包括字符串。
我遇到问题的线路是 alphabetized.get(x) = arr.get(x);
该程序无法编译,因为它无法识别值 x 但我在 for 循环的前面说明了它,所以我不确定为什么它不会 运行...
public class TestArrays {
static Scanner reader = new Scanner(System.in);
public static void main(String[] args) {
String pat;
ArrayList<String> names = new ArrayList<String>();
names.add("anna");
names.add("bob");
names.add("matthew");
names.add("charles");
names.add("effron");
System.out.print(newArray(names, pat));
}
public static ArrayList<String> newArray(ArrayList<String> arr, String str) {
List<String> alphabetized = new ArrayList<String>(arr.size());
arr.add(str);
java.util.Collections.sort(arr);
for (int x=0; x<=arr.size();x++){
alphabetized.get(x) = arr.get(x);
}
return alphabetized;
}
}
谢谢
问题是表达式 alphabetized.get(x)
是一个值,而不是一个变量,所以你不能给它赋值。这与数组访问表达式形成对比,数组访问表达式可以充当变量,例如alphabetizedArray[x] = array[x];
.
您需要 set
method,它接受一个索引和该索引的新值。
alphabetized.set(x, arr.get(x));
要更改 ArrayList 中的值,您必须使用 set 方法。在您的情况下,替换 alphabetized.get(x) = arr.get(x);
的正确代码是 alphabetized.set(x, arr.get(x));
但是我不明白为什么您不能只 return arr 而不是按字母顺序排列。
几件事。
首先,在您的 newArray 方法中,没有必要创建副本和 return 该副本,除非您不想更改原始 ArrayList
static Scanner reader = new Scanner(System.in);
public static void main(String[] args) {
String pat = reader.nextLine();
ArrayList<String> names = new ArrayList<String>();
names.add("anna");
names.add("bob");
names.add("matthew");
names.add("charles");
names.add("effron");
System.out.print(newArray(names, pat));
}
public static ArrayList<String> newArray(ArrayList<String> arr, String str) {
ArrayList<String> alphabetized = new ArrayList<String>(arr.size());
arr.add(str);
java.util.Collections.sort(arr);
return arr;
//for (int x=0; x<arr.size();x++){
// alphabetized.add(arr.get(x));
//}
//return alphabetized;
}
结果:
2、如果你要复制到另一个数组,请理解这行代码。
ArrayList<String> alphabetized = new ArrayList<String>(arr.size());
您刚刚创建了一个列表,其容量与您传入的数组大小相同,但其中没有实际元素。您仍然必须像任何其他列表一样添加到列表中。一旦你添加了一个使大小大于容量的元素,新的内存将被自动分配以容纳新的项目。
编辑
我忘了说你的复制循环应该是
for (int x = 0; x < arr.size(); x++)
而不是
for (int x = 0; x <= arr.size(); i++)
您的原始 for 循环将导致 IndexOutOfBounds 异常,因为您将尝试从原始数组中获取超过其最大索引值的项目。一个 10 项列表的大小为 10,但索引范围为 0 - 9。您原来的 for 循环将尝试获取不存在的索引 10。
static Scanner reader = new Scanner(System.in);
public static void main(String[] args) {
String pat = reader.nextLine();
ArrayList<String> names = new ArrayList<String>();
names.add("anna");
names.add("bob");
names.add("matthew");
names.add("charles");
names.add("effron");
System.out.print(newArray(names, pat));
}
public static ArrayList<String> newArray(ArrayList<String> arr, String str) {
ArrayList<String> alphabetized = new ArrayList<String>(arr.size());
arr.add(str);
java.util.Collections.sort(arr);
for (int x=0; x<arr.size();x++){
alphabetized.add(arr.get(x));
}
return alphabetized;
}
结果:
所以我的这个程序的目标是创建一个方法,它将一个字符串和一个 ArrayList
作为参数,它将字符串添加到 ArrayList
然后按字母顺序排列整个事情和 return 按字母顺序排列的 ArrayList
包括字符串。
我遇到问题的线路是 alphabetized.get(x) = arr.get(x);
该程序无法编译,因为它无法识别值 x 但我在 for 循环的前面说明了它,所以我不确定为什么它不会 运行...
public class TestArrays {
static Scanner reader = new Scanner(System.in);
public static void main(String[] args) {
String pat;
ArrayList<String> names = new ArrayList<String>();
names.add("anna");
names.add("bob");
names.add("matthew");
names.add("charles");
names.add("effron");
System.out.print(newArray(names, pat));
}
public static ArrayList<String> newArray(ArrayList<String> arr, String str) {
List<String> alphabetized = new ArrayList<String>(arr.size());
arr.add(str);
java.util.Collections.sort(arr);
for (int x=0; x<=arr.size();x++){
alphabetized.get(x) = arr.get(x);
}
return alphabetized;
}
}
谢谢
问题是表达式 alphabetized.get(x)
是一个值,而不是一个变量,所以你不能给它赋值。这与数组访问表达式形成对比,数组访问表达式可以充当变量,例如alphabetizedArray[x] = array[x];
.
您需要 set
method,它接受一个索引和该索引的新值。
alphabetized.set(x, arr.get(x));
要更改 ArrayList 中的值,您必须使用 set 方法。在您的情况下,替换 alphabetized.get(x) = arr.get(x);
的正确代码是 alphabetized.set(x, arr.get(x));
但是我不明白为什么您不能只 return arr 而不是按字母顺序排列。
几件事。
首先,在您的 newArray 方法中,没有必要创建副本和 return 该副本,除非您不想更改原始 ArrayList
static Scanner reader = new Scanner(System.in);
public static void main(String[] args) {
String pat = reader.nextLine();
ArrayList<String> names = new ArrayList<String>();
names.add("anna");
names.add("bob");
names.add("matthew");
names.add("charles");
names.add("effron");
System.out.print(newArray(names, pat));
}
public static ArrayList<String> newArray(ArrayList<String> arr, String str) {
ArrayList<String> alphabetized = new ArrayList<String>(arr.size());
arr.add(str);
java.util.Collections.sort(arr);
return arr;
//for (int x=0; x<arr.size();x++){
// alphabetized.add(arr.get(x));
//}
//return alphabetized;
}
结果:
2、如果你要复制到另一个数组,请理解这行代码。
ArrayList<String> alphabetized = new ArrayList<String>(arr.size());
您刚刚创建了一个列表,其容量与您传入的数组大小相同,但其中没有实际元素。您仍然必须像任何其他列表一样添加到列表中。一旦你添加了一个使大小大于容量的元素,新的内存将被自动分配以容纳新的项目。
编辑
我忘了说你的复制循环应该是
for (int x = 0; x < arr.size(); x++)
而不是
for (int x = 0; x <= arr.size(); i++)
您的原始 for 循环将导致 IndexOutOfBounds 异常,因为您将尝试从原始数组中获取超过其最大索引值的项目。一个 10 项列表的大小为 10,但索引范围为 0 - 9。您原来的 for 循环将尝试获取不存在的索引 10。
static Scanner reader = new Scanner(System.in);
public static void main(String[] args) {
String pat = reader.nextLine();
ArrayList<String> names = new ArrayList<String>();
names.add("anna");
names.add("bob");
names.add("matthew");
names.add("charles");
names.add("effron");
System.out.print(newArray(names, pat));
}
public static ArrayList<String> newArray(ArrayList<String> arr, String str) {
ArrayList<String> alphabetized = new ArrayList<String>(arr.size());
arr.add(str);
java.util.Collections.sort(arr);
for (int x=0; x<arr.size();x++){
alphabetized.add(arr.get(x));
}
return alphabetized;
}
结果: