【问题标题】:Sort an ArrayList of String where the String contains numeric values in java [duplicate]对String的ArrayList进行排序,其中String包含java中的数值[重复]
【发布时间】:2017-03-08 09:02:20
【问题描述】:

代码如下

public static void main(String[] args) {
    ArrayList<String> arrayList=new ArrayList<String>();
    arrayList.add("1001");
    arrayList.add("999");

    String val="";
    boolean unsorted=true;

     if (val.contains("isAscending")) {

            for (int i = 0; i < arrayList.size() - 1; i++) {
                if (arrayList.get(i).toLowerCase().compareTo(arrayList.get(i + 1).toLowerCase()) <= 0) {
                    unsorted = false;
                    System.out.println(unsorted);
                } else {
                    break;
                }
            }

        } else {

            for (int i = 0; i < arrayList.size() - 1; i++) {
                if (arrayList.get(i).toLowerCase().compareTo(arrayList.get(i + 1).toLowerCase()) >= 0) {
                    unsorted = false;
                    System.out.println(unsorted+" "+"descending");
                } else {
                    break;
                }
            }
        }

}

上面的程序工作正常,但问题是当我更换 具有以下数组列表的数组列表不起作用

arrayList.add("22");
arrayList.add("8");

我的意思是,如果第一个索引后面跟着一个 1 位数字,它就会失败

同样的重复在这里

arrayList.add("1001");
arrayList.add("1000");

为此,上面的代码有效

arrayList.add("1001");
arrayList.add("999");

为此它失败了

要求是验证一个arraylist是否有序,或者不需要对arraylist进行排序

【问题讨论】:

  • 为什么不将 ArrayList 转换为 ArrayList?然后排序?
  • 所有字符串都保证只有数字吗?如果是这样,只需在比较之前使用Integer.parseInt() - 但是如果字符串只有数字,为什么要转换为小写呢?
  • 顺便说一句,请不要在标题中说“对 ArrayList 进行排序”,然后在您的问题中说“无需排序”。这让每个人都感到困惑。
  • 嗨 ajb 转换为小写是因为如果 arraylist 有字符串值怎么办。如果 arraylist 包含字符串或数值,我只希望该方法用于两者
  • 你是什么意思“有字符串值”?这是一个ArrayList&lt;String&gt;,所以它当然有字符串值。问题是,这些字符串值可以包含字母吗?如果他们可以,那么你的问题没有意义。

标签: java


【解决方案1】:

如果您想知道您的列表是否已排序,您可以使用自定义比较器使用字符串表示的实际整数对您的ArrayList 进行排序。然后,您可以将此排序列表与原始列表进行比较。

Collections.sort(arrayList, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        try {
            // try to compare the two values as integers, if possible
            Integer val1 = Integer.valueOf(s1);
            Integer val2 = Integer.valueOf(s2);
            return val1.compareTo(val2);
        }
        catch (NumberFormatException e) {
            // fall back to sort them as strings
            return s1.compareTo(s2);
        }
    }
});

正如@ajb 提到的,假设每个字符串都可以转换为整数并在其他地方处理异常可能更简单。在这种情况下,我们可以使用:

Collections.sort(arrayList, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return Integer.valueOf(s1).compareTo(Integer.valueOf(s2));
    }
});

【讨论】:

  • 严格来说,这实际上不是一个有效的比较器,因为它破坏了传递性 ("2"
  • @ajb 根据您的 cmets,如果列表中有字符,则 OP 可能根本没有意义。无论如何,假设所有字符串都是有效整数,我的答案应该对他有用。我添加了try 块只是为了覆盖我的基地。
  • 如果所有字符串都应该是有效的整数,那么最好只传播异常而不是捕获它。有一个违反规则的比较器可能会导致一些有趣的异常被抛出 Timsort。抛出一个易于理解的异常可能比其中一个更好。但你是对的——如果字符串都是有效的整数,那么你的解决方案很好(但对于一个大列表,先转换所有内容然后排序可能更有效)。
【解决方案2】:

该方法尝试将字符串解析为整数,如果成功则比较数字,否则比较字符串。

public class Test {

public static void main(String[] args) {
    ArrayList<String> arrayList = new ArrayList<String>();
    arrayList.add("1");
    arrayList.add("999");
    arrayList.add("1001");

    boolean isAsc = true;
    boolean isSorted = true;

    for (int i = 0; i < arrayList.size() -1; i++) {
            int a, b;
            boolean numbs;
            try {
                int a = Integer.parseInt(arrayList.get(i));
                int b = Integer.parseInt(arrayList.get(i + 1));
                if ((isAsc && a > b) || (!isAsc && a < b)) {
                    isSorted = false;
                    break;
                } 
            } catch (NumberFormatException) {
                 if ((isAsc  && arrayList.get(i).toLowerCase().compareTo(arrayList.get(i + 1).toLowerCase() > 0) || (arrayList.get(i).toLowerCase().compareTo(arrayList.get(i + 1).toLowerCase() < 0)) {
                 isSorted = false;
                 break;
            }
            }
    }

    if (isSorted) {
        System.out.println("List is sorted !");
    } else {
        System.out.println("List is not sorted !");
    }
}
}

希望我能帮上忙

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 2019-09-18
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2017-02-24
    • 2011-03-11
    • 2012-03-24
    相关资源
    最近更新 更多