0

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

编辑:显然我的代码在检查数组“猫猿狗斑马”时返回“真”,这显然是错误的。

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

6 回答 6

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

上面的行是错误的。返回的值将是正数且不严格等于 1。

尝试更改为

if (list.get(i).compareTo(list.get(j)) >0)
于 2013-07-12T21:24:07.523 回答
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);
}
于 2013-07-12T21:36:32.537 回答
2

It's far easier than it looks: just iterate over the list, checking if adjacent elements are in the right order. If all adjacent pairs are in order, then the whole list is.

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;
}
于 2013-07-12T21:26:32.080 回答
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;
}
于 2013-07-12T21:29:04.600 回答
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);
                 }        
             });

资源

或返回真或假

于 2013-07-12T21:23:34.860 回答
0

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

myList.zipWithNext { a, b ->
    if (a > b) {
         fail("Expected a sorted list, but $a > $b")
    }
}
于 2018-07-24T01:24:40.740 回答