允许用户使用字符串数组进行演奏。他们可以将字符串添加到数组中,从数组中删除字符串,在数组中搜索字符串,最终他们将能够对数组进行排序。排序使我很困惑。我尝试了几种不同的方法。第一种方法是将数组转换为ArrayList并使用Collections对ArrayList进行排序,然后将其转换回静态类数组。没用
我尝试的第二种方法是遍历数组,并尝试仅对用户添加的字符串进行排序,而不是对数组中的所有内容进行排序(因为数组中存在一些空值)。也许我应该遍历数组,然后将非null值存储到可以排序的新数组中?但是,如果要在对新数组排序后添加更多字符串怎么办?这就是为什么我停止使用第二种解决方案的原因。第三次尝试是在我的数组上使用Arrays.sort(),但是由于某种原因,它不起作用。
这是例外:
Exception in thread "main" java.lang.NullPointerException
at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:290)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:157)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at testingSearch.sortArray(testingSearch.java:93)
at testingSearch.main(testingSearch.java:42)
这是我的代码:
import java.util.Scanner;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class testingSearch {
static String[] strArray;
static {
strArray = new String[5];
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(true){
System.out.println("1. Add string to the string array.");
System.out.println("2. Remove string from the string array.");
System.out.println("3. Display strings in string array.");
System.out.println("4. Search the string array for a string.");
System.out.println("5. Sort the strings in the string array.");
int userChoice = 0;
userChoice = input.nextInt();
switch(userChoice) {
case 1:
addString();
break;
case 2:
removeString();
break;
case 3:
displayStrings();
break;
case 4:
searchArray();
break;
case 5:
sortArray();
break;
}
}
}
public static void addString(){
Scanner input = new Scanner(System.in);
System.out.println("What string do you want to add?");
String userInput;
userInput = input.nextLine();
ArrayList<String> stringList = new ArrayList<String> (Arrays.asList(strArray));
stringList.add(userInput);
strArray = stringList.toArray(strArray);
}
public static void removeString(){
Scanner input = new Scanner(System.in);
System.out.println("What string do you want to remove?");
String userInput;
userInput = input.nextLine();
ArrayList<String> stringList = new ArrayList<String> (Arrays.asList(strArray));
stringList.remove(userInput);
strArray = stringList.toArray(strArray);
}
public static void displayStrings(){
for (String s: strArray){
if (!(s == null)){
System.out.println(s);
}
}
}
public static void searchArray(){
Scanner input = new Scanner(System.in);
System.out.println("What string do you want to search the array for?");
String userInput;
userInput = input.nextLine();
ArrayList<String> stringList = new ArrayList<String>(Arrays.asList(strArray));
if (stringList.contains(userInput)){
System.out.println("The string array contains that string!");
}
else {
System.out.println("The string array does not contain that string...");
}
}
public static void sortArray(){
/*ArrayList<String> stringList = new ArrayList<String> (Arrays.asList(strArray));
Collections.sort(stringList);
strArray = stringList.toArray(strArray);*/
/*for (String s: strArray) {
if (!(s == null)){
Arrays.sort(strArray);
}
}*/
List<String> stringList = new ArrayList<String>(Arrays.asList(strArray));
Collections.sort(stringList);
strArray = stringList.toArray(strArray);
//Arrays.sort(strArray);
}
}
您得到NullPointerException
s
的原因可以由(强调我的)的javadocArrays#sort()
解释:
根据对象的自然顺序,将指定对象数组按升序排序。 数组中的所有元素都必须实现
Comparable
接口。
因为Arrays.sort()
期望Comparable
元素而不是null
值,所以NullPointerException
当方法尝试调用时,您最终得到a
compareTo()
。
解决此问题的“立即解决”的方法是简单地确保null
将数组中的所有元素替换为非null
,例如""
。因此,请在创建数组时以及删除String
和将null
元素设置为之后遍历数组""
。但是,此解决方案对于您的代码而言可能效果不佳,因为在String
删除每个解决方案之后都需要另一个循环,这可能会增加工作量。至少由于String
池的魔力,它不需要您创建一堆对象,因此它比使用其他对象可能要好一些。
更好的解决方案是只使用ArrayList<String>
而不是原始数组。毕竟,您已经在使用来管理addString()
和removeString()
,因此从数组到数组的转换要少得多ArrayList
。此外,您在排序时无需担心NPE(至少在您的用例中;在排序时添加null
到Collection
仍然会导致NPE)。
您也可以只使用原始数组,但是管理该数组会很烦人,因此我不建议您这样做。如果操作正确,则不必担心NPE。
我主要是一个VB.NET程序员,对VTL(Velocity Template Language)非常陌生。我目前正试图定制一个应用程序,使用Velocity模板和Jython。 我在一个现有文件中有以下VTL代码。以下代码从一个JSON文件中获得一些键值对,并将它们以一个简洁的表形式输出到浏览器: 我可以显示$keyset数组: 我试图做的是按字母顺序对$keyset数组中的字符串进行排序。 我尝
问题内容: 我有一个包含多个数组的数组,我想根据这些数组中的某个字符串对数组进行排序。 如何按名称排序,以便 阿尔伯特排 在首位, 齐默尔曼排 在最后? 我知道如果可以使用整数进行排序,但是字符串使我毫无头绪,该怎么办。 谢谢您帮忙!:) 问题答案: 这可以通过将支持函数作为参数传递给方法调用来实现。 像这样:
本文向大家介绍Swift对字符串数组进行排序,包括了Swift对字符串数组进行排序的使用技巧和注意事项,需要的朋友参考一下 例子 3.0 最简单的方法是使用sorted(): 或者 sort() 您可以将闭包作为排序参数: 尾随闭包的替代语法: 但是,如果数组中的元素不一致,则会出现意外结果: 要解决此问题,请对元素的小写版本进行排序: 或者import Foundation使用NSString的
问题内容: 我有这样的txt文件中的数据列表 我的任务是按照每个标准对这些数据进行排序,例如)按日期,纬度和经度排序 我尝试像这样的泡沫排序 这可行,但是需要太多时间 那里有在txt文件数据 有没有其他方法可以对这些数据进行排序? 问题答案: 我可能会破坏一些学生的家庭作业,但是这里… 正如课题所建议的那样,Java的自然方法是创建一个表示您的数据的类。然后实现一个将传递给实用方法的方法。 在运行
问题内容: 我有一个字符串arraylist’names’。其中包含人员名称。我想按字母顺序对arraylist进行排序。请帮助我 问题答案: 这将解决您的问题… 要对ArrayList对象进行排序,请使用方法。这是一种静态方法。它将ArrayList对象的元素按升序排序。 万一下面的代码在注释中不起作用,请尝试以下代码。 创建一个自定义比较器类: 然后按您的排序:
我正在尝试编写一个程序,根据列表中最不频繁的字符排列字符串列表。例如,如果列表是,列表中的字母频率将是a-5,n-3,p-2,e-2,l-1,o-1,r-1,g-1,b-1。由于橙色包含最不频繁的字母,程序将返回橙色,然后是apple,然后是banana。 到目前为止,我已经编写了按频率排列列表中所有字母的代码。但我需要应用它来找出哪个字符串包含最不频繁的字母。 这是我的代码: