【问题标题】:java sorting in alphabetical order [duplicate]java按字母顺序排序[重复]
【发布时间】:2014-12-21 15:37:28
【问题描述】:

我正在尝试按字母顺序对名称列表进行排序,但在线程“main”java.lang.NullPointerException 中不断收到错误异常,我不知道为什么。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class alphabeticalOrder {

 static String names[];
 static int count = 0;
 static String sorting;

 public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub

  String[] names = new String[500];

  File namesFile = new File("names.txt");
  Scanner inputFile = new Scanner(namesFile);

  while (inputFile.hasNextLine()) {
   String line = inputFile.nextLine();
   String[] namesDetails = line.split("     ");
   names[count] = namesDetails[0];
   count++;
  }

  sort();

  System.out.println(Arrays.toString(names));

 }

 public static void sort() {

  int namesLength = names.length;

  for (int i = 0; i < namesLength - 1; i++) {
   for (int j = 0; j < namesLength - 1; j++) {
    if (names[j].compareTo(names[j - 1]) > 0) {
     sorting = names[j - 1];
     names[j - 1] = names[j];
     names[j] = sorting;
    }
   }
  }

 }

}

Customers txt 有这些名字

Smith, Alexandra

Downes, Trish

Akbal, Maria

并且数组必须等于 500

【问题讨论】:

    标签: java


    【解决方案1】:

    改变

    if (names[j].compareTo(names[j - 1]) > 0) { 
    

    到

    if (names[j] != null && names[j].compareTo(names[j - 1]) > 0) {
    

    而烦人的空指针异常就会消失。

    如果你对 500 个字符串数组的痴迷,我建议你试试 TreeSet,因为它会为你完成所有的排序工作。

    public static void main(String[] args)
    {
        Set<String> alphabetical = new TreeSet<String>();
        alphabetical.add("A");
        alphabetical.add("Z");
        alphabetical.add("M");
    
        System.out.println(alphabetical);
    }
    

    输出:[A, M, Z]

    【讨论】:

    • 两种方法都试了,还是报错
    • 究竟在哪一行?
    • if (names[j] != null && names[j].compareTo(names[j - 1]) > 0) { 这和我有方法的主要方法中的排序部分排序()
    • 如果你还没有像这个人一样忘记编译:stackoverflow.com/questions/1816776/… 然后执行 System.out.println(names[j] + "
    • 我正在这样做,但我仍然收到错误,我不知道为什么,因为它看起来正确但无法编译
    【解决方案2】:

    您的 names 数组有 500 个元素,其中大部分为空。这就是为什么当您调用names[j].compareTo() 以获得空引用时,您会得到NullPointerException。

    您应该只尝试对输入的名称进行排序。

    代替

    int namesLength = names.length;
    

    试试

    int namesLength = count;
    

    因为count 包含您实际拥有的输入数量。

    顺便说一句,您的 sort() 方法还有其他问题:

    1. 循环应该从 0 到 namesLength - 1,所以条件应该是 j &lt; namesLength
    2. 当 j==0 时,names [j-1] 会给你ArrayIndexOutOfBoundsException

    【讨论】:

      【解决方案3】:

      数组大小为500,编号为6。

      当您为数组的前六个索引分配六个名称时,其余索引仍然具有null 值。因此,与空值比较会抛出NullPointerException。

      为什么?

      因为 Java 中的对象在第一次定义时由 null 值初始化。

      建议:

      尝试使用ArrayList,它会自行收缩和扩展

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        • 2017-12-19
        • 1970-01-01
        • 2017-08-20
        • 2011-05-29
        • 2016-01-23
        相关资源
        最近更新 更多