我正在检查我的数组中的字符串是否按字母顺序排列。我的代码检查器说我的代码无法解决某些情况,但我真的不确定如何更改它。
编辑:显然我的代码在检查数组“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;
}
答案 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);
}
});
或者返回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")
}
}