Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串对象分离为标记?_Java_Arrays_Collections - Fatal编程技术网

Java 将字符串对象分离为标记?

Java 将字符串对象分离为标记?,java,arrays,collections,Java,Arrays,Collections,当一个String对象如下所示时,它应该将这些值分成几部分,用“、ve”对它们进行排序,并通过分组数字返回一个列表 String=123456 4568 567852 78212. 使用比较器,您可以尝试以下方法: public static void main(String[] args) { String input = "11B,11A,12,12/1,13,14,15,16,16A,17,17/1,57-51B,57,57-51A,1,10,11,53B,53A,53

当一个String对象如下所示时,它应该将这些值分成几部分,用“、ve”对它们进行排序,并通过分组数字返回一个列表

String=123456 4568 567852 78212.






使用比较器,您可以尝试以下方法:

public static void main(String[] args) {
    String input = "11B,11A,12,12/1,13,14,15,16,16A,17,17/1,57-51B,57,57-51A,1,10,11,53B,53A,53C,57-51C,57A";
    List<String> items = Arrays.asList(input.split("\\s*,\\s*"));


    Collections.sort(items, new Comparator<String>() {
        public int compare(String o1, String o2) {

            String o1StringPart = o1.replaceAll("\\d", "");
            String o2StringPart = o2.replaceAll("\\d", "");


            if(o1StringPart.equalsIgnoreCase(o2StringPart))
            {
                return extractInt(o1) - extractInt(o2);
            }
            return o1.compareTo(o2);
        }

        int extractInt(String s) {
            String num = s.replaceAll("\\D", "");
            // return 0 if no digits found
            return num.isEmpty() ? 0 : Integer.parseInt(num);
        }
    });

    for (String s : items) {
        System.out.println(s);
    }
}
publicstaticvoidmain(字符串[]args){
字符串输入=“11B,11A,12,12/1,13,14,15,16,16A,17,17/1,57-51B,57,57-51A,1,10,11,53B,53A,53C,57-51C,57A”;
列表项=数组.asList(输入.split(“\\s*,\\s*”);
Collections.sort(items,newcomparator(){
公共整数比较(字符串o1、字符串o2){
字符串o1StringPart=o1.replaceAll(“\\d”,即“”);
字符串o2StringPart=o2.replaceAll(“\\d”,即“”);
if(o1StringPart.equalsIgnoreCase(o2StringPart))
{
返回extractInt(o1)-extractInt(o2);
}
返回o1。与(o2)相比;
}
int extractInt(字符串s){
字符串num=s.replaceAll(“\\D”和“);
//如果找不到数字,则返回0
返回num.isEmpty()?0:Integer.parseInt(num);
}
});
用于(字符串s:项){
系统输出打印项次;
}
}

这并不能完全满足您对所需输出的要求,但它应该可以让您开始。

创建一个
。Java是一种OO语言。该
可以保存令牌的某些命名部分,不管它们是什么。现在您只需要一个理解
比较器。您甚至可以使用sim卡ply
实现Comparable
。在线上有大量关于如何实现comparator的教程。您在阅读Boris的评论7分钟后发表评论说您无法做到这一点。显然,您在解决问题方面的努力还不够。请尝试通过实现修改代码以成功实现comparator即使基本的比较逻辑不一定能给你你想要的输出,你也要尝试修改你的逻辑以得到你想要的输出。你没有做足够的研究。如果你有错误,就解决错误。我不是要问你,但这显然是一个家庭作业问题。你需要学会自己解决这些问题为便于研究的解决方案提出问题的广告。我花了3分钟研究一个解决方案,并实现了一个运行正常的比较器。这里是:注意,它不会给你想要的输出,但它是一个使用比较器的初始解决方案。作为答案添加。我觉得我在这里付出了太多,但公平地说,你可以在其他地方很容易地找到这个解决方案,我猜英语不是你的第一语言,这就是你在寻找解决方案时遇到困难的原因。可能重复的注意事项是,作为比较器可以称为
log(n)
times,在比较器中工作通常是个坏主意。尽管答案确实说明了如何开始解决问题。感谢您的帮助@BoristheSpider@BoristheSpider这是乐观的;)比较器将被调用至少
n-1次,这是不可避免的。最坏的情况是
n
时间
logn
…@Holger我指的是每个项目-我认为这是正确的?正如中所述,标记化n次的成本是无法避免的,但在比较器中,它将在每个项目中执行多次。@Boristeder最坏的情况是在
O(n logn)
(请注意,这不是实际调用次数的近似值),但由于比较器在每次调用上执行两个标记化,即使是在
n-1
调用的最佳情况下,它也做了两倍必要的工作。尽管如此,我还是会继续动态执行,但消除了标记化,而不是重的
replaceAll(regex)
,可以使用比字符串稍重的简单字符迭代进行比较,例如
字符串。不区分大小写\u顺序