如何根据第一个字符串在第二个字符串数组 android、java 中包含的单词的位置对字符串数组进行排序

How sort a string array based on the location of a word that the first string contains in a second string array, android, java

我正在尝试对字符串数组进行排序以便在列表视图中使用。我有两个字符串数组,一个是我要显示的单词,另一个是我想要的排序顺序。任何不在排序列表中的单词都可以放在最后。例如:

String[] order = {"Paperclip", "Pencil", "Earphones", "Pen"};
String[] displaylist = {"Pencil 1", "Pen 1", "Dog 1", "Earphones 1", "Pen 2", "Paperclip 1", "Pencil 2", "Pen 3", "Earphones 2"};

我希望之后对显示列表进行排序的方式是:

String[] displaylistsorted = {"Paperclip 1", "Pencil 1", "Pencil 2", "Earphones 1", "Earphones 1", "Earphones 2", "Pen 1", "Pen 2", "Pen 3", "Dog 1"}

我希望能够在排序后将列表保留在同一个案例中。

我浏览了很多不同的教程和自定义比较器的其他堆栈问题,但我对 Java 的初级知识最终迫使我在这里写一个问题。

非常感谢您的帮助!

你遍历单词集,并与search-terms的数组一一比较。如果找到匹配项,则将列表中的单词添加到为该术语创建的惰性匹配列表中。

如果您完成了这组搜索,您可以按照搜索词的顺序加入结果列表,并在末尾添加剩余的词。

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

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

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

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

    theResult.addAll(remainders);

您谈到了自定义比较器...使用 String 方法直接比较数组的内容可能是更直接的解决方案。但是,出于学术目的,使用自定义比较器意味着使用 class 来解决您的问题。在 Java 中创建自定义比较器需要您实现 Comparable 接口。所有这一切的真正含义是您的 class 将需要实施方法 compareTo method:

class MyClass implements Comparable {
   ...
   @Override
   public int compareTo(Object o) {
       ...
   }
}

当您覆盖 compareTo 时,您决定是什么使一个对象成为 "greater" 或 "less than" 另一个对象。如果一个对象比另一个对象"greater",你的自定义方法应该return1。如果它是"less than"另一个对象,它应该return-1。如果相等,则应return0。"greater"或"less than"表示对象应如何排序。

据我所知,您的 order 数组中的元素与将被调用以帮助排序的元素的开头相匹配,例如"Paperclip 1""Paperclip" 开头。假设这是真的,一个适当的 compareTo 方法可以使用 startsWith 来决定适当的顺序:

class MyClass implements Comparable {
    private static final String order[] = {"Paperclip", "Pencil", "Earphones", "Pen"};
    private String value;
    ...
    @Override
    public int compareTo(Object o) {
        MyClass that = (MyClass)o;
        int thisRank = 0;
        int thatRank = 0;
        for (String ord : order) {
            if (this.value.startsWith(ord)) {
                thisRank = count;
            }
            if (that.value.startsWith(ord)) {
                thatRank = count;
            }
            count++;
        }
        if (thisRank > thatRank) return 1;
        if (thisRank < thatRank) return -1;
        return 0;
    }
}

然后您需要使用新 class 创建某种集合,然后对其进行排序:

MyClass displayList[] = { new MyClass("Pencil 1"), new MyClass("Pen 1"),
    new MyClass("Dog 1"), ... }
Arrays.sort(displayList);

TreeSet<MyClass> displayList = new TreeSet<>();
displayList.add(new MyClass("Pencil 1"));
displayList.add(new MyClass("Pen 1"));
...

Arrays.sort 使用您的 compareTo 方法对数组进行正确排序。 TreeSet 也一样;每次插入新元素时它都会调用 compareTo