检查数组中的字符串是否按字母顺序排列

时间:2013-07-12 21:19:25

标签: java alphabetical

我正在检查我的数组中的字符串是否按字母顺序排列。我的代码检查器说我的代码无法解决某些情况,但我真的不确定如何更改它。

编辑:显然我的代码在检查数组“cat ape dog zebra”时返回“true”,这显然是假的。

public boolean isSorted()
{
    boolean sorted = true;                          
    for(int i = 0; i < list.size(); i++)
    {
        for(int j = i+1; j < list.size(); j++) 
        {
            if (list.get(i).compareTo(list.get(j)) == 1)
            {
                sorted = false;
            }  
        }  
    }                
    return sorted;
}

6 个答案:

答案 0 :(得分:6)

if (list.get(i).compareTo(list.get(j)) == 1)

上述行是错误的。返回的值为正数,不严格等于1.

尝试更改为

if (list.get(i).compareTo(list.get(j)) >0)

答案 1 :(得分:4)

我猜您正在使用实例变量来保存String列表。在我使用Collections.sort()

的地方尝试此代码
public boolean isSorted() {

    // Copies all of the elements from one list into another.
    List<String> listSorted = new ArrayList<String>(list);

    // Sorts the new list.
    Collections.sort(listSorted);

    // Check if both of list are equals.
    return listSorted.equals(list);
}

答案 2 :(得分:2)

它比看起来容易得多:只是遍历列表,检查相邻元素是否按正确顺序排列。如果所有相邻的对都是有序的,那么整个列表就是。

public boolean isSorted()
{
    for(int a=0;a<list.size()-1;a++)
    {
        if(list.get(a).compareTo(list.get(a+1))>0)
        {
            return false;
        }
    }
    return true;
}

答案 3 :(得分:0)

使用String.compareTo()是一种非常简单的方法。

String.compareTo()如果字符串在方法的参数之前,则返回负数,如果相同,则返回0;如果字符串在方法的参数之后,则返回正数

你这样做的方式:

if (list.get(i).compareTo(list.get(j)) == 1)

非常接近,但应该是

if (list.get(i).compareTo(list.get(j)) > 0)

您可以使用比较器旁边的快速排序,或者在您的情况下检查它是否已排序

boolean isSorted(String[] words) {

    for (int i = 0; i < words.length()-1; i++) {
        if (words[i].compareTo(words[i+1] >= 0) {
            return false;
        }
    }
    return true;
}

或者,如果你想对它们进行排序,这将有效:

Collections.sort(fooList,
             new Comparator<String>()
             {
                 public int compare(String s1, String s2)
                 {
                     return s1.compareTo(s2);
                 }        
             });

Source

或者返回true或false

答案 4 :(得分:0)

如果左侧的字符串比右侧的字符串“大”,则compareTo()返回正值(不一定是1)。因此,您需要将条件从== 1更改为>= 1

此外,您不需要在所有元素上运行的第二个循环(j)。您只需比较两个连续元素,如下所示:

public boolean isSorted()  {
    for(int i = 1; i < list.size(); i++) 
        if (list.get(i).compareTo(list.get(i - 1)) >= 1) 
          return false;
    return true;
}

答案 5 :(得分:0)

我知道这是一个Java问题,但这是我最终非常简洁地在Kotlin中实现此问题的方式:

myList.zipWithNext { a, b ->
    if (a > b) {
         fail("Expected a sorted list, but $a > $b")
    }
}