【问题标题】:Checking if Strings in an Array are in Alphabetical Order检查数组中的字符串是否按字母顺序排列
【发布时间】:2013-07-12 21:19:24
【问题描述】:

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

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

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

【问题讨论】:

  • 什么情况?你能显示错误吗
  • 尝试写一些单元测试
  • 为什么要知道它们是否已排序?通常你只需要对你的收藏进行排序......
  • 只是为了清楚。您的列表是否应该传递给此方法?还是在您的应用程序中列出一个全局变量?

标签: java alphabetical


【解决方案1】:
if (list.get(i).compareTo(list.get(j)) == 1)

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

尝试更改为

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

【讨论】:

  • 我明白了,谢谢你的帮助。我一定是看错了 Java API。
【解决方案2】:

我猜你正在使用实例变量来保存String 的列表。在我使用@987654321@的地方试试这个代码:

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

【讨论】:

  • 只需从旧列表中创建一个新列表,无需逐步添加每个元素。 List newList = new ArrayList(oldList);
  • 更重要的是,这是一种非常低效的方法。检查排序应该需要线性时间和恒定的额外空间。这需要 nlog(n) 时间和线性附加空间。正如其他人所指出的,@user2577950 的代码有两个缺陷。 compareTo() 的输出比较不正确,发现不匹配时没有短路。
【解决方案3】:

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

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

【讨论】:

  • 正如Shamin所说,最好写list.get(i).compareTo(list.get(j)) &gt;0
  • 这段代码的另一个优点是它在找到未排序元素的那一刻就退出了。 OP 代码读取完整列表,这可能是不必要的:如果一个条目未排序,则完整列表未排序
  • @Barranka OP的答案实际上只返回最后两个条目的比较。
【解决方案4】:

compareTo() 如果左侧的字符串“大于”右侧的字符串,则返回正值(不一定为 1)。因此,您需要将条件从== 1 更改为&gt;= 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】:

    使用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

    或者返回真假

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-19
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        相关资源
        最近更新 更多