当前位置: 首页 > 面试题库 >

在Java中对字符串数组进行排序

郁博学
2023-03-14
问题内容

允许用户使用字符串数组进行演奏。他们可以将字符串添加到数组中,从数组中删除字符串,在数组中搜索字符串,最终他们将能够对数组进行排序。排序使我很困惑。我尝试了几种不同的方法。第一种方法是将数组转换为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);

    }

}

问题答案:

您得到NullPointerExceptions
的原因可以由(强调我的)的javadocArrays#sort()解释:

根据对象的自然顺序,将指定对象数组按升序排序。 数组中的所有元素都必须实现Comparable接口。

因为Arrays.sort()期望Comparable元素而不是null值,所以NullPointerException当方法尝试调用时,您最终得到a
compareTo()

解决此问题的“立即解决”的方法是简单地确保null将数组中的所有元素替换为非null,例如""。因此,请在创建数组时以及删除String和将null元素设置为之后遍历数组""。但是,此解决方案对于您的代码而言可能效果不佳,因为在String删除每个解决方案之后都需要另一个循环,这可能会增加工作量。至少由于String池的魔力,它不需要您创建一堆对象,因此它比使用其他对象可能要好一些。

更好的解决方案是只使用ArrayList<String>而不是原始数组。毕竟,您已经在使用来管理addString()removeString(),因此从数组到数组的转换要少得多ArrayList。此外,您在排序时无需担心NPE(至少在您的用例中;在排序时添加nullCollection仍然会导致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。 到目前为止,我已经编写了按频率排列列表中所有字母的代码。但我需要应用它来找出哪个字符串包含最不频繁的字母。 这是我的代码: