我需要估计数组列表是否已排序(不排序)。
对字符串进行排序时,它们按字母顺序排列。 我尝试使用compareTo()方法来确定哪个字符串首先出现
如果数组列表已排序,则返回true,否则返回false。
代码:
public boolean isSorted()
{
boolean sorted = true;
for (int i = 1; i < list.size(); i++) {
if (list.get(i-1).compareTo(list.get(i)) != 1) sorted = false;
}
return sorted;
}
简易测试:
ArrayList<String> animals = new ArrayList<String>();
ArrayListMethods zoo = new ArrayListMethods(animals);
animals.add("ape");
animals.add("dog");
animals.add("zebra");
//test isSorted
System.out.println(zoo.isSorted());
System.out.println("Expected: true");
animals.add("cat");
System.out.println(zoo.isSorted());
System.out.println("Expected: false");
animals.remove("cat");
animals.add(0,"cat");
System.out.println(zoo.isSorted());
System.out.println("Expected: false");
**Output:**
false
Expected: true
false
Expected: false
false
Expected: false
此简单测试仅显示1/3
覆盖率。
如何解决这个问题。
答案 0 :(得分:8)
您的方法中有一个小错误。应该是:
public boolean isSorted()
{
boolean sorted = true;
for (int i = 1; i < list.size(); i++) {
if (list.get(i-1).compareTo(list.get(i)) > 0) sorted = false;
}
return sorted;
}
>0
代替!=1
,您无法确定是否已返回1
。
答案 1 :(得分:2)
更改条件:
if (list.get(i - 1).compareTo(list.get(i)) >0)
您应该检查>0
而不是!=-1
。
如果参数字符串等于此字符串,则值为0;如果此字符串按字典顺序小于字符串参数,则小于0的值;如果此字符串按字典顺序大于字符串参数,则大于0的值。
答案 2 :(得分:1)
试试这个
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Sort {
public static void main(String []args) {
List<String> l1=new ArrayList<String>();
List<String> l2=new ArrayList<String>();
l1.add("a");
l1.add("b");
l1.add("c");
l2.add("b");
l2.add("c");
l2.add("a");
if(isSorted(l1)){
System.out.println("already sorted");
}
else{
Collections.sort(l1);
}
}
public static boolean isSorted(List<String> list){
String previous = "";
for (String current: list) {
if (current.compareTo(previous) < 0)
return false;
previous = current;
}
return true;
}
}
答案 3 :(得分:1)
您可以编写像isSortedList(List list)
这样的实用工具方法。
public static boolean isSortedList(List<? extends Comparable> list)
{
if(list == null || list.isEmpty())
return false;
if(list.size() == 1)
return true;
for(int i=1; i<list.size();i++)
{
if(list.get(i).compareTo(list.get(i-1)) < 0 )
return false;
}
return true;
}
与实用方法一样,您可以在任何地方使用它。
答案 4 :(得分:0)
你必须将compareTo表达式更改为任何正数,这表示前一个元素按字母顺序排在当前元素之后,因此列表不是有序的
public boolean isSorted()
{
boolean sorted = true;
for (int i = 1; i < list.size(); i++) {
if (list.get(i-1).compareTo(list.get(i)) > 0) sorted = false;
}
return sorted;
}
答案 5 :(得分:0)
您需要检查未分类的案例。
这意味着如果您假设排序升序,那么未排序的案例将会在索引i
中找不到索引i-1
的元素。
其中element[i] < element[i-1]
。