java按字母顺序排序

时间:2014-10-26 07:53:42

标签: java

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

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;
    }
   }
  }

 }

}

客户txt有这些名称

Smith, Alexandra

Downes, Trish

Akbal, Maria

并且数组必须等于500

3 个答案:

答案 0 :(得分:1)

更改

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

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

恼人的空指针异常将消失。

如果你已经克服了对你的500字符串阵列的困扰,我建议你尝试使用TreeSet,因为它会为你完成所有的排序工作。

Cheat Sheet

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]

答案 1 :(得分:0)

您的names数组有500个元素,其中大部分都是null。当您致电NullPointerException获取空引用时,这就是您获得names[j].compareTo()的原因。

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

而不是

int namesLength = names.length;

尝试

int namesLength = count;

由于count包含您实际拥有的输入数量。

BTW,你的sort()方法有其他问题:

  1. 循环应该从0变为namesLength - 1,因此条件应为j < namesLength
  2. 当j == 0 时,
  3. names [j-1]会给你ArrayIndexOutOfBoundsException

答案 2 :(得分:0)

您拥有大小为500的数组,并且您的名称为6

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

<强>为什么

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

建议

尝试使用缩小和扩展的ArrayList