java按字母顺序排序[重复]

Posted

技术标签:

【中文标题】java按字母顺序排序[重复]【英文标题】:java sorting in alphabetical order [duplicate] 【发布时间】: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

【问题讨论】:

【参考方案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) 这和我有方法的主要方法中的排序部分排序() 如果你还没有像这个人一样忘记编译:***.com/questions/1816776/… 然后执行 System.out.println(names[j] + " 我正在这样做,但我仍然收到错误,我不知道为什么,因为它看起来正确但无法编译【参考方案2】:

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

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

代替

int namesLength = names.length;

试试

int namesLength = count;

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

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

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

【讨论】:

【参考方案3】:

数组大小为500,编号为6

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

为什么

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

建议

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

【讨论】:

以上是关于java按字母顺序排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

NSDictionary 按字母顺序排序[重复]

按字母顺序对 NSMutableArray 进行排序[重复]

按字母顺序对HashMap程序的输出进行排序[重复]

如何通过删除名称开头的数字按字母顺序对数据进行排序[重复]

根据子列表中的第二个元素按字母顺序对列表进行排序,但不区分大小写[重复]

VBA Access - 按字母顺序排序列表框