2015-03-02 130 views
0

我阅读了一个包含城市及其人口的文件,我尝试使用选择类别按字母顺序对城市进行分类。 问题是,由于某种原因,它以奇怪的方式排序。 “排序”列表的顺序是“ABDCEFHG ...”我试着跟着它,但我无法理解它在哪里混乱。这是代码:选择分类字符串

//Selection 
    for (int i = 0; i < cities.size() - 1; i++) 
    { 
     int minPos = i; 
     for (int j = i + 1; j < cities.size(); j++) 
     { 
      if (cities.get(j).compareToIgnoreCase(cities.get(minPos)) < -1) 
       minPos = j; 
     } 
     swap(cities, minPos, i); 
    } 
    System.out.print("\nSelection: "); 
    for(int i = 0; i < cities.size(); i++) 
     System.out.print(cities.get(i) +"|"); 

private static void swap(ArrayList <String> a, int i, int j) 
{ 
    String temp = a.get(i); 
    a.set(i, a.get(j)); 
    a.set(j, temp); 
} 

任何想法有什么不对?

感谢

+3

您是否尝试过使用'... <0'而不是'... <-1'? – August 2015-03-02 23:22:45

+3

你为什么使用<-1?你应该使用<0 – thermite 2015-03-02 23:23:06

+0

是的,这是问题。这是我第一次使用字符串比较,所以我对它有点新。谢谢! – Nik 2015-03-02 23:26:49

回答

0

正如其他人所说的,你的问题是几乎可以肯定你的... < -1比较,这是比较的情况下基本上是没有意义的。如图Comparable记载,在Java比较通常通过返回

负整数,零或正整数,根据此对象是比指定的对象小于,等于或大于完成。

String.compareToIgnoreCase()遵循相同的规则:

Returns: 
    a negative integer, zero, or a positive integer as the specified 
    String is greater than, equal to, or less than this String, ignoring 
    case considerations. 

这些合同故意说没有什么的负或正数可能,因此实现能够做什么是最容易。许多实现将明确地返回-1,01,但包括String中的那些的其他实施例使用减法作为快捷方式,返回正在比较的项目之间的差异,例如, x.compareTo(y)确实return x-y。如果xy相同,则结果为0,否则如果x较小则返回负数,如果x较大则返回正数。

总之,您必须始终使用0作为比较点。