【问题标题】:How to sort a String Array first by letters in the beginning and then by numbers afterwards如何在开始时先按字母排序字符串数组,然后再按数字排序
【发布时间】:2016-05-19 22:34:36
【问题描述】:

我正在尝试对大型字符串数组进行排序。我希望它主要按开头的单词排序,基于我的顺序。但是我有超过 1 个具有相同开头单词的项目,所以我希望能够使用在初始单词之后的数字对单词进行排序。

例如:

String[] unordered = {"Pencil 2", "Cat 3", "Pencil 1", "Cat 1", "Cat 2"}

我希望排序的结果是:

String[] ordered = {"Cat 1", "Cat 2", "Cat 3", "Pencil 1", "Pencil 2"}

就目前而言,我正在对列表进行排序,而随后忽略了数字。所以我最终得到了这样的结果:

String somewhat ordered = {"Cat 3", "Cat 1", "Cat 2", "Pencil 2", "Pencil 1"}

我现在的代码如下所示:

String[] sortlist = {"Pencil 2", "Cat 3", "Pencil 1", "Cat 1", "Cat 2"}

String[] Bookorder = {"Cat", "Pencil", etc...}

List<String>[] results = new List[bookorder.length];
            LinkedList<String> remainders = new LinkedList<String>();

            for (String word : sortlist) {
                boolean found = false;
                for (int i = 0; i < bookorder.length; i++) {
                    if (word.startsWith(bookorder[i])) {
                        if (results[i] == null) results[i] = new LinkedList<String>();
                        results[i].add(word);
                        found = true;
                        break;
                    }
                }

                if (!found) {
                    remainders.add(word);
                }
            }

            finalsortedlist = new ArrayList<String>(sortlist.length);
            for (List<String> result : results) {
                if (result != null) {
                    finalsortedlist.addAll(result);
                }
            }

            finalsortedlist.addAll(remainders);

            String[] finalsortedarray = new String[finalsortedlist.size()];
            finalsortedarray = finalsortedlist.toArray(finalsortedarray);

            dblinesequivalent = Arrays.toString(finalsortedarray);

这很好用,只是它不对数字进行排序。如果不弄乱之前的单词排序,我想不出办法。

如果您愿意提供任何帮助,我将不胜感激。提前致谢。

编辑:

我不希望按字母顺序对项目进行排序,它们是根据另一个指定所需顺序的列表进行排序的。

【问题讨论】:

    标签: android arrays sorting


    【解决方案1】:
    private void reorder() {
        String[] unordered = {"Pencil 2", "Cat 3", "Pencil 1", "Cat 1", "Cat 2"};
        Arrays.sort(unordered);
    }
    

    编辑:这是适用于所有数字的版本

    private static void reorder() {
        String[] unordered = { "Pencil 2", "Cat 11", "Pencil 1", "Cat 1", "Cat 2" };
        Arrays.sort(unordered);
        System.out.println("After Arrays.sort()");
        for (String s : unordered)
            System.out.println(s);
        for (int i = 0; i < unordered.length; i++) {
            for (int j = i + 1; j < unordered.length - 1; j++) {
                if (unordered[i].substring(0, unordered[i].indexOf(' '))
                        .equals(unordered[j].substring(0, unordered[j].indexOf(' ')))) {
                    String numI = unordered[i].substring(unordered[i].indexOf(' ') + 1);
                    String numJ = unordered[j].substring(unordered[j].indexOf(' ') + 1);
                    if (Integer.parseInt(numI) > Integer.parseInt(numJ)) {
                        String tmp = unordered[i];
                        unordered[i] = unordered[j];
                        unordered[j] = tmp;
                    }
                }
            }
        }
        System.out.println("After sorting");
        for (String s : unordered)
            System.out.println(s);
    }
    

    【讨论】:

    • 请注意,这仅在数字仅通过 9 时才有效。
    • 你能给我解释一下吗?看起来您正在使用完全无序列表,如果我使用部分有序列表,它仍然有效吗?它会保持单词的排序,并且只改变项目相对于开头包含相同单词的其他项目的位置吗?
    • 我没有看到第一条评论。他们确实比这更高。还有其他想法吗?
    • 我看到你完全改变了你做这件事的方式。我认为这不会使用前面的单词保持正确的顺序。不对吗?
    • 你能解释一下发生了什么吗?当我使用 Arrays.sort() 进行排序时,它会打乱我使用排序方法已经获得的顺序。我想做的是使用数字对我拥有的东西进行排序。
    猜你喜欢
    • 2013-06-29
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2021-11-28
    • 2021-12-20
    • 2018-03-11
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多