You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

验证LinkedList<Integer>与网页表格主电话列的升序/降序状态

问题1:验证LinkedList是否升序/降序

其实思路很直接:遍历列表,逐一对比相邻元素的大小关系,就能判断整体是升序、降序还是无序。我给你写了个实用的工具方法,还加了枚举来明确返回状态,用起来很方便:

import java.util.LinkedList;

public class SortValidation {
    public enum SortOrder { ASCENDING, DESCENDING, UNSORTED }

    public static SortOrder checkSortOrder(LinkedList<Integer> list) {
        if (list == null || list.size() <= 1) {
            // 空列表或单个元素的情况,你可以按需调整返回值——比如有些场景会认为单个元素也算升/降序,这里默认返回UNSORTED
            return SortOrder.UNSORTED;
        }

        boolean isAscending = true;
        boolean isDescending = true;

        for (int i = 0; i < list.size() - 1; i++) {
            int current = list.get(i);
            int next = list.get(i + 1);

            if (current > next) {
                isAscending = false;
            }
            if (current < next) {
                isDescending = false;
            }

            // 要是已经确定既不升也不降,直接提前跳出循环,省点性能
            if (!isAscending && !isDescending) {
                break;
            }
        }

        if (isAscending) {
            return SortOrder.ASCENDING;
        } else if (isDescending) {
            return SortOrder.DESCENDING;
        } else {
            return SortOrder.UNSORTED;
        }
    }

    // 测试用例,你可以直接跑来看效果
    public static void main(String[] args) {
        LinkedList<Integer> ascList = new LinkedList<>();
        ascList.add(1);
        ascList.add(3);
        ascList.add(5);
        System.out.println(checkSortOrder(ascList)); // 输出ASCENDING

        LinkedList<Integer> descList = new LinkedList<>();
        descList.add(10);
        descList.add(7);
        descList.add(2);
        System.out.println(checkSortOrder(descList)); // 输出DESCENDING

        LinkedList<Integer> unsortedList = new LinkedList<>();
        unsortedList.add(2);
        unsortedList.add(5);
        unsortedList.add(3);
        System.out.println(checkSortOrder(unsortedList)); // 输出UNSORTED
    }
}

问题2:网页表格电话号码字符串的排序验证

你转Integer报错太正常了!这些电话号码里有一堆非数字字符——加号、括号、减号、空格、还有x,Java的Integer.valueOf()根本没法处理这些,不抛NumberFormatException才怪。解决这个问题得先明确你的排序需求:是按电话号码的数字数值大小排序,还是按字符串本身的字典序排序?我给你两种方案:

方案1:按纯数字数值验证排序

如果需求是看电话号码的实际数字大小是否有序,那得先把所有非数字字符去掉,再转成数值(注意:很多电话号码长度超过Integer的范围,比如你示例里的390655889900是12位,Integer最大才10位,所以得用Long):

import java.util.ArrayList;
import java.util.List;

public class PhoneSortValidation {
    public enum SortOrder { ASCENDING, DESCENDING, UNSORTED }

    // 提取电话号码里的所有数字字符
    private static String extractDigits(String phone) {
        if (phone == null) {
            return "";
        }
        // 用正则把非数字的字符全替换掉
        return phone.replaceAll("[^0-9]", "");
    }

    public static SortOrder checkPhoneSortOrder(List<String> phoneList) {
        if (phoneList == null || phoneList.size() <= 1) {
            return SortOrder.UNSORTED;
        }

        List<Long> numericPhones = new ArrayList<>();
        for (String phone : phoneList) {
            String digits = extractDigits(phone);
            // 处理空字符串的情况(比如遇到无效的电话号码)
            numericPhones.add(digits.isEmpty() ? 0L : Long.parseLong(digits));
        }

        // 复用问题1的排序判断逻辑就行
        boolean isAscending = true;
        boolean isDescending = true;

        for (int i = 0; i < numericPhones.size() - 1; i++) {
            long current = numericPhones.get(i);
            long next = numericPhones.get(i + 1);

            if (current > next) {
                isAscending = false;
            }
            if (current < next) {
                isDescending = false;
            }

            if (!isAscending && !isDescending) {
                break;
            }
        }

        if (isAscending) {
            return SortOrder.ASCENDING;
        } else if (isDescending) {
            return SortOrder.DESCENDING;
        } else {
            return SortOrder.UNSORTED;
        }
    }

    // 用你的示例数据测试一下
    public static void main(String[] args) {
        List<String> phones = List.of(
            "+1 0107968641x551",
            "+1 (814) 775-5474",
            "+1 (308) 729-2823",
            "+1 5258739916x978",
            "390655889900",
            "+1 (100) 100-1001 x000",
            "+1 (111)22222"
        );

        System.out.println(checkPhoneSortOrder(phones)); // 你的示例数据本身是无序的,所以会返回UNSORTED
    }
}

方案2:按字符串字典序验证排序

如果需求是直接按电话号码显示的字符串顺序验证(比如只看字符的ASCII顺序,不管数值大小),那不用转数值,直接用String.compareTo()方法比较就行:

public static SortOrder checkPhoneStringSortOrder(List<String> phoneList) {
    if (phoneList == null || phoneList.size() <= 1) {
        return SortOrder.UNSORTED;
    }

    boolean isAscending = true;
    boolean isDescending = true;

    for (int i = 0; i < phoneList.size() - 1; i++) {
        String current = phoneList.get(i);
        String next = phoneList.get(i + 1);

        // compareTo返回正数表示current在字典序上比next大
        int compareResult = current.compareTo(next);
        if (compareResult > 0) {
            isAscending = false;
        }
        if (compareResult < 0) {
            isDescending = false;
        }

        if (!isAscending && !isDescending) {
            break;
        }
    }

    if (isAscending) {
        return SortOrder.ASCENDING;
    } else if (isDescending) {
        return SortOrder.DESCENDING;
    } else {
        return SortOrder.UNSORTED;
    }
}

这里要注意:字符串字典序的结果可能和你直觉里的数字排序不一样,比如"+1 (100)..."里的(ASCII码比空格小,所以会排在"+1 010..."前面,一定要和产品或者测试需求确认清楚规则哦!


内容的提问来源于stack exchange,提问作者Nandhis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:31:57