Java - 检查字符串的 ArrayList 是不是按字母顺序排列

Posted

技术标签:

【中文标题】Java - 检查字符串的 ArrayList 是不是按字母顺序排列【英文标题】:Java - Checking if an ArrayList of String are in alphabetical orderJava - 检查字符串的 ArrayList 是否按字母顺序排列 【发布时间】:2012-01-31 12:06:56 【问题描述】:

我有一个名为 account 的 ArrayList,其中包含字符串。我正在尝试编写一个方法来检查它们是否有序并根据它们是否有序返回真或假。

你会怎么做呢?我已经尝试使用 for 循环检查初始字符,但它出错了。我创建了一个新的 ArrayList 并将其设置为与原始数组相同,然后对其进行排序并比较它们,但由于它们包含相同的数据,因此它总是返回 true。

只是一个额外的快速问题,因为我正在为字符串执行此操作,您将如何检查某些数字是否按升序/降序排列?通过同一个校长?

谢谢!

【问题讨论】:

***.com/questions/3047051/… 结合 String#compareTo(String) 方法的 javadoc 应该可以帮助您完成 to any:使用 String.compareTo 并不意味着 alphabetical 顺序。需要 compareToIgnoreCase 或 java.text.Collator 的某个版本 正确答案取决于您是否真的必须“编写方法”或“找出列表是否已排序”。在第二种情况下,最好不要实际编写方法并使用 Guava 的 Ordering 类等外部库(有关详细信息,请参阅我的答案)。只是不要成为***的另一位作者:) 【参考方案1】:

试试这个(当然,假设您想使用它们的自然顺序来比较字符串):

String previous = ""; // empty string: guaranteed to be less than or equal to any other

for (final String current: thelist) 
    if (current.compareTo(previous) < 0)
        return false;
    previous = current;


return true;

这是因为String 实现了Comparable&lt;String&gt;,并且将使用字符串的自然顺序进行比较。

【讨论】:

@dantuch,很多 final 提醒我在 c++ 中过度使用 const,有时只会让代码变得痛苦(至少在 java 中无法强制执行) @bestsss 这是编码风格的问题,一如既往 @bestsss 这个循环在决赛中看起来不是更好吗?在前 5 个字符之后,您已经知道它不会更改该列表的任何元素,因此它只会读取它。这很好。 @dantuch,final 并不意味着 不更改该列表的任何元素。这意味着局部变量引用不会改变。更改列表中的元素内容将需要不可变类(String 确实是一个),并且与final 无关。 for in 确保没有修改,它适用于 iterator 有点奇怪,因为它可能不使用 remove(),但这是另一个奇怪的点(将迭代器转换为 Enumeration 基本上已弃用) @bestsss:foreach 循环确实可以确保,但是没有什么可以阻止您重用引用——final 可以防止这种情况【参考方案2】:

如果您不介意使用外部库 (Guava) Ordering 可以:

boolean isSorted = Ordering.natural().isOrdered(list);

这适用于String 和其他Comparables。如果您要检查某些自定义类型的排序,请使用 Ordering 类或其子类中的任何静态工厂方法。

编辑用于不区分大小写的排序:

boolean isSorted = Ordering.from(String.CASE_INSENSITIVE_ORDER).isOrdered(list);

【讨论】:

@bestsss 对,但看看接受的答案,字符串的自然排序实际上是 OP 的意思。无论如何,我都会在我的答案中添加注释。【参考方案3】:

我认为 for 循环适合这个。我将采取的方法是对照前一个单词检查每个单词,看看它们是否按正确的字母顺序排列。最好的情况是 O(2) 来确定列表是无序的,最坏的情况是 O(n) 来告诉你列表是有序的。

编辑:上面 fge 的回答概述了所描述方法的代码。

【讨论】:

+1 用于适当的运行时案例。我建议使用 String 类的compareTo() 方法来执行此操作。这同样适用于 IntegerLongDouble... 等数字类。【参考方案4】:

使用Collection类的排序方法:

List<String> list = new ArrayList<String>();
//Add Elements
Collections.sort(list);

将指定的列表按升序排序,根据 其元素的自然排序。

【讨论】:

【参考方案5】:
ArrayList<String> initial = // smth
ArrayList<String> copy = // copy initial list here
Collections.sort(initial);
return initial.equals(copy);

【讨论】:

假设您有 list 和 9 999 999 个字符串,每个字符串都很长,在前几个元素之后,您可以看出它不是用简单的 if 内部循环排序的。不是会更快吗? ;) 简单的解决方案并不快。一切都取决于您的需求。【参考方案6】:

只需使用循环并检查它们是否有序:

boolean isSorted = true;
for(int i = 0; i < list.size() - 1; i++) 
   // current String is > than the next one (if there are equal list is still sorted)
   if(list.get(i).compareToIgnoreCase(list.get(i + 1)) > 0)  
       isSorted = false;
       break;
   

【讨论】:

以上是关于Java - 检查字符串的 ArrayList 是不是按字母顺序排列的主要内容,如果未能解决你的问题,请参考以下文章

Java - 将 ArrayList 中的字符串与 .txt 文件中的所有文本进行比较

检查字符串是不是在字符串的 ArrayList 中

使用 Java 流检查 ArrayList 内容

java 27 - 7 反射之 通过反射越过泛型检查

检查Java中的ArrayList中是不是存在Object

如何检查arraylist是不是包含字符串