对我的选择排序的建议 / Java
Suggestions for my Selection Sort / Java
我的选择排序算法不工作。
我收到以下错误:
//线程异常"main"java.lang.NullPointerException
注意:这是针对 java class 的。我没有太多经验。我完成了作业。我试图了解我的排序算法不起作用的原因。
关于如何纠正问题的任何建议?尖端?
更正? ...任何帮助都将不胜感激。
这是我的代码:
private void sortFlowers(String flowerPack[]) {
// TODO: Sort the flowers in the pack (No need to display them here) - Use Selection or Insertion sorts
// NOTE: Special care is needed when dealing with strings! research the compareTo() method with strings
for(int i = 0; i < flowerPack.length; i++){
String currentMinFlow = flowerPack[i];
int minIndex = i;
for(int j = i; j < flowerPack.length; j++){
if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0){
currentMinFlow = flowerPack[j];
minIndex = j;
}
}
if(minIndex != i){
flowerPack[minIndex] = flowerPack[i];
flowerPack[i] = currentMinFlow;
}
}
}
异常:
Exception in thread "main" java.lang.NullPointerException at
java.lang.String$CaseInsensitiveComparator.compare(String.java:1181) at
java.lang.String$CaseInsensitiveComparator.compare(String.java:1174) at
java.lang.String.compareToIgnoreCase(String.java:1227) at
Assignment01Driver.sortFlowers(Assignment01Driver.java:112) at
Assignment01Driver.<init>(Assignment01Driver.java:37) at
Assignment01Driver.main(Assignment01Driver.java:5)
问题是因为您的数组是用固定大小创建的。
String[] flowerPack = new String[25];
当您创建引用类型变量数组时,每个变量都将初始化为 null
的值。如果在为每个变量赋值之前调用 sortFlowers
方法,则会 运行 出现问题。
for(int i = 0; i < flowerPack.length; i++){
String currentMinFlow = flowerPack[i];
在上面的代码段中,您遍历了数组中的所有 25 个位置,包括仍具有值 null
的值。然后,以下行导致错误:
if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0){
由于您正在遍历整个数组,因此您最终得到 currentMinFlow
的值为 null
。如果您尝试对 null
引用值进行方法调用,您最终会得到 NullPointerException
。
通常,当您不确定可能拥有多少数据项时,您很少希望使用固定大小的数组。在这种情况下,您可能希望使用 ArrayList
代替标准数组。 ArrayList
本质上是一个动态数组,它会根据需要增长和收缩以包含您存储在其中的元素。这将解决 null
值的问题,因为这将阻止您在数组中包含任何未使用的元素。
替换
String[] flowerPack = new String[25];
与
ArrayList<String> flowerPack = new ArrayList<>();
如果您想在 ArrayList
中添加或删除一个值,您可以这样做
// Add value.
flowerPack.add(value);
// Remove value
flowerPack.remove(value);
如果要访问ArrayList
中的某个元素:
String element = flowerPack.get(indexOfElement);
如果要获取ArrayList
的大小:
int size = flowerPack.size();
如果您不想修改排序方法,可以通过替换行
来保持不变
sortFlowers(flowerPack);
与
sortFlowers(flowerPack.toArray(new String[0]));
有关其他 ArrayList
方法和属性的概述,请查看在线文档:
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html
该错误表明您正在尝试处理包含空值的数组。为了更好地理解,请填写数组中的所有 25 个点和 运行 程序,它不会给您任何错误。
这是您需要的解决方案。
private void sortFlowers(String flowerPack[])
{
//get the length of the array by counting arrays where the value is not null.
int length = 0;
for (int i = 0; i < flowerPack.length; i++)
{
if (flowerPack[i] != null)
{
length = length + 1;
}
}
//just confirm that the count is correct.
System.out.println(length);
//set the length to the "length" variable as we have found above.
for(int i = 0; i < length; i++)
{
String currentMinFlow = flowerPack[i];
int minIndex = i;
for(int j = i; j < length;j++){
if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0)
{
currentMinFlow = flowerPack[j];
minIndex = j;
}
}
if(minIndex != i){
flowerPack[minIndex] = flowerPack[i];
flowerPack[i] = currentMinFlow;
}
}
}
只需用上面的代码替换您的 sortFlowers 方法并检查。
我的选择排序算法不工作。 我收到以下错误: //线程异常"main"java.lang.NullPointerException
注意:这是针对 java class 的。我没有太多经验。我完成了作业。我试图了解我的排序算法不起作用的原因。 关于如何纠正问题的任何建议?尖端? 更正? ...任何帮助都将不胜感激。 这是我的代码:
private void sortFlowers(String flowerPack[]) {
// TODO: Sort the flowers in the pack (No need to display them here) - Use Selection or Insertion sorts
// NOTE: Special care is needed when dealing with strings! research the compareTo() method with strings
for(int i = 0; i < flowerPack.length; i++){
String currentMinFlow = flowerPack[i];
int minIndex = i;
for(int j = i; j < flowerPack.length; j++){
if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0){
currentMinFlow = flowerPack[j];
minIndex = j;
}
}
if(minIndex != i){
flowerPack[minIndex] = flowerPack[i];
flowerPack[i] = currentMinFlow;
}
}
}
异常:
Exception in thread "main" java.lang.NullPointerException at
java.lang.String$CaseInsensitiveComparator.compare(String.java:1181) at
java.lang.String$CaseInsensitiveComparator.compare(String.java:1174) at
java.lang.String.compareToIgnoreCase(String.java:1227) at
Assignment01Driver.sortFlowers(Assignment01Driver.java:112) at
Assignment01Driver.<init>(Assignment01Driver.java:37) at
Assignment01Driver.main(Assignment01Driver.java:5)
问题是因为您的数组是用固定大小创建的。
String[] flowerPack = new String[25];
当您创建引用类型变量数组时,每个变量都将初始化为 null
的值。如果在为每个变量赋值之前调用 sortFlowers
方法,则会 运行 出现问题。
for(int i = 0; i < flowerPack.length; i++){
String currentMinFlow = flowerPack[i];
在上面的代码段中,您遍历了数组中的所有 25 个位置,包括仍具有值 null
的值。然后,以下行导致错误:
if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0){
由于您正在遍历整个数组,因此您最终得到 currentMinFlow
的值为 null
。如果您尝试对 null
引用值进行方法调用,您最终会得到 NullPointerException
。
通常,当您不确定可能拥有多少数据项时,您很少希望使用固定大小的数组。在这种情况下,您可能希望使用 ArrayList
代替标准数组。 ArrayList
本质上是一个动态数组,它会根据需要增长和收缩以包含您存储在其中的元素。这将解决 null
值的问题,因为这将阻止您在数组中包含任何未使用的元素。
替换
String[] flowerPack = new String[25];
与
ArrayList<String> flowerPack = new ArrayList<>();
如果您想在 ArrayList
中添加或删除一个值,您可以这样做
// Add value.
flowerPack.add(value);
// Remove value
flowerPack.remove(value);
如果要访问ArrayList
中的某个元素:
String element = flowerPack.get(indexOfElement);
如果要获取ArrayList
的大小:
int size = flowerPack.size();
如果您不想修改排序方法,可以通过替换行
来保持不变sortFlowers(flowerPack);
与
sortFlowers(flowerPack.toArray(new String[0]));
有关其他 ArrayList
方法和属性的概述,请查看在线文档:
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html
该错误表明您正在尝试处理包含空值的数组。为了更好地理解,请填写数组中的所有 25 个点和 运行 程序,它不会给您任何错误。
这是您需要的解决方案。
private void sortFlowers(String flowerPack[])
{
//get the length of the array by counting arrays where the value is not null.
int length = 0;
for (int i = 0; i < flowerPack.length; i++)
{
if (flowerPack[i] != null)
{
length = length + 1;
}
}
//just confirm that the count is correct.
System.out.println(length);
//set the length to the "length" variable as we have found above.
for(int i = 0; i < length; i++)
{
String currentMinFlow = flowerPack[i];
int minIndex = i;
for(int j = i; j < length;j++){
if(currentMinFlow.compareToIgnoreCase(flowerPack[j]) <0)
{
currentMinFlow = flowerPack[j];
minIndex = j;
}
}
if(minIndex != i){
flowerPack[minIndex] = flowerPack[i];
flowerPack[i] = currentMinFlow;
}
}
}
只需用上面的代码替换您的 sortFlowers 方法并检查。