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

如何根据第一个字符串在第二个字符串数组中包含的单词的位置对字符串数组进行排序,android,java,java,android,arrays,sorting,comparable,Java,Android,Arrays,Sorting,Comparable,我正在尝试对列表视图中使用的字符串数组进行排序。我有两个字符串数组,一个是我想显示的单词,另一个是我想要的排序顺序。任何不在排序列表中的单词都可能位于末尾。例如: String[] order = {"Paperclip", "Pencil", "Earphones", "Pen"}; String[] displaylist = {"Pencil 1", "Pen 1", "Dog 1", "Earphones 1", "Pen 2", "Paperclip 1", "Pencil 2", "

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

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"};
我希望displaylist之后的排序方式是:

String[] displaylistsorted = {"Paperclip 1", "Pencil 1", "Pencil 2", "Earphones 1", "Earphones 1", "Earphones 2", "Pen 1", "Pen 2", "Pen 3", "Dog 1"}
我想能够保持在相同的情况下排序后的名单

我已经阅读了很多不同的教程和定制比较器的其他堆栈问题,但是我的Java初级知识最终迫使我在这里写一个问题


非常感谢你的帮助

您迭代这组单词,并将它们逐个与搜索词数组进行比较。如果找到匹配项,则将列表中的单词添加到为该术语创建的匹配项列表中

如果已完成设置,则按照搜索条件的顺序加入结果列表,并在末尾添加其余单词

    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);
List[]results=新列表[order.length];
LinkedList remainders=新LinkedList();
for(字符串字:显示列表){
布尔值=false;

对于(int i=0;i您谈到自定义比较器……使用字符串方法直接比较数组的内容可能是一个更简单的解决方案。但是,对于学术界而言,使用自定义比较器意味着使用类来解决您的问题。在Java中创建自定义比较器需要实现de>Comparable
接口。所有这一切实际上意味着您的类将需要实现方法
compareTo
方法:

class MyClass implements Comparable {
   ...
   @Override
   public int compareTo(Object o) {
       ...
   }
}
当您重写
compareTo
时,您可以决定是什么使一个对象“大于”或“小于”另一个对象。如果一个对象“大于”另一个对象,您的自定义方法应返回1。如果它“小于”另一个对象,则应返回-1。如果它相等,则应返回0。即“大于”或“小于”指示如何对对象进行排序

据我所知,您的
顺序
数组中的元素与需要帮助排序的元素的开头匹配,例如
“回形针1”
“回形针”开头
。假设这是真的,一个适当的
比较方法可以使用
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;
    }
}

TreeSet displayList=new TreeSet();
添加(新的MyClass(“铅笔1”);
添加(新的MyClass(“画笔1”);
...

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

欢迎使用StackOverflow!目前,您的问题太广泛了-有很多可能的方法来实现您想要的结果。一个很好的方法是箭头向下你的问题将包括你已经尝试过的内容-这样我们可以解释哪些部分需要更正以及为什么。我在很多不同的地方阅读过,但我找不到一个与我尝试做的内容相匹配的示例。很抱歉,它太宽泛了。也许下次我问问题时,我会比现在知道更多。谢谢但我得到一个错误:java.lang.NullPointerException:尝试调用接口方法'java.lang.Object[]java.util.Collection.toArray()'在空对象引用上,如果您更具体地说明在何处发现错误,这将非常有用。通过创建延迟列表,并不是所有
结果的元素都保证为非空。
结尾的组合循环需要空检查。我已经添加了它。谢谢!修复了它。这是否确实包括d中的所有项iPlay list?是什么让你认为缺少了什么?我有一个很长的项目列表,我无法全部检查。是否有可能这不包括所有项目?或者只是将它们添加到末尾?为什么要为每个对象创建一个类?你可以将比较代码放入一个
比较器
对象中。我想这是正确的是的……这个问题提到了比较器,所以我只是用类放了一个例子。
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"));
...