【问题标题】:Java: Sort an array according to matching string / pattern [closed]Java:根据匹配的字符串/模式对数组进行排序[关闭]
【发布时间】:2013-06-21 19:45:43
【问题描述】:

我需要对一个数组进行排序,其中匹配项出现而其他项将下降。

例如。我有一个数组: [ z , asxdf , abasdf , abcasdf , b , bc , bcd , c ] 我需要的是,当我传递一个关键字假设 "b" 时,它应该对给定的数组进行排序,其中所有以 b.. 开头的字符串将首先出现,然后之后休息。这将产生最终输出: [ b , bc , bcd , z , c , .. (rest).]

如果可以在 Java 中使用比较器?

String keyWord = "b";
String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};
Arrays.sort(s, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {

            //Code to sort array according to need

    }
});
System.out.println(Arrays.toString(s));

Result -&gt; [ b , bc , bcd , z , c , ...]

(如果可以帮助我解决这个问题,我可以使用 List 而不是 Array 或任何其他)

【问题讨论】:

  • 所以你想让我们为你做比较算法?
  • 是的,如果它不伤害你。但是,如果您再次阅读我的问题,您会看到我问的“如果可以在 Java 中使用比较器?”。
  • 算法是否必须稳定,即2组中的每一个中的元素顺序是否必须与原始数组中的相同?
  • 否,但优先考虑与关键字最匹配的人。
  • “最佳匹配”是什么意思?他们要么匹配,要么不匹配。

标签: java string sorting collections comparator


【解决方案1】:

回答是否可以使用 Comparator 的问题,答案是肯定的:您只需要创建一个新的 Comparator 类而不是创建一个匿名 Comparator,如下所示:

    class MyComparator implements Comparator<String> {

        private final String keyWord;

        MyComparator(String keyWord) {
            this.keyWord = keyWord;
        }

        @Override
        public int compare(String o1, String o2) {

            if(o1.startsWith(keyWord)) {
                return o2.startsWith(keyWord)? o1.compareTo(o2): -1;
            } else {
                return o2.startsWith(keyWord)? 1: o1.compareTo(o2); 
            }
        }
    }

然后在您的代码中使用该比较器:

    String keyWord = "b";
    String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};
    Arrays.sort(s, new MyComparator(keyWord));
    System.out.println(Arrays.toString(s));

【讨论】:

  • 我也有类似的方法。你打败了我! ;)
【解决方案2】:

因为关键字匹配后的字符串长度似乎很重要,所以这是我的版本:

Arrays.sort(s, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {

        boolean o1Has = o1.startsWith( keyWord );
        boolean o2Has = o2.startsWith( keyWord );

        if( o1Has && !o2Has  ) return -1;
        else if( o2Has && !o1Has ) return 1;
        else if( o1Has && o2Has ) return 0;
        else
            return o1.length() - o2.length();
    }
});

产量:

[b, bc, bcd, z, c, asxdf, abasdf, abcasdf]

【讨论】:

  • @n0741337 非常感谢!它工作:)
【解决方案3】:

我还要补充一点,您可以在本 Oracle 教程 http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html 中阅读有关 ComparatorComparable 的信息。

【讨论】:

  • 感谢您的参考,一定会阅读。
【解决方案4】:
final String keyWord = "b";
String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};
Arrays.sort(s, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {

            boolean o1_has_keyWord = o1.indexOf(keyWord.charAt(0)) == 0 && o1.contains(keyWord);
            boolean o2_has_keyWord = o2.indexOf(keyWord.charAt(0)) == 0 && o2.contains(keyWord);

        if (o1_has_keyWord && o2_has_keyWord)
        {
            if (o1.length() == o2.length())
            {
                if (o1.indexOf(keyWord.charAt(0)) > o2.indexOf(keyWord.charAt(0))){
                    return -1;
                }
                else if (o1.indexOf(keyWord.charAt(0)) == o2.indexOf(keyWord.charAt(0))){
                    return 0;
                }
                else
                {
                    return 1;
                }
            }
            else if (o1.length() > o2.length())
            {
                    return 1;
            }
            else 
            {
                return -1;
            }
        }
        else if (o1_has_keyWord && !o2_has_keyWord)
        {
            return -1;
        }
        else if (!o1_has_keyWord && o2_has_keyWord)
        {
            return 1;
        }


        return 0;

            //Code to sort array according to need

    }
});
System.out.println(Arrays.toString(s));

输出:

[b, bc, bcd, z, asxdf, abasdf, abcasdf, c]

【讨论】:

  • 谢谢,这很好用,但问题是它对关键字 = 'b'、'bc' 和 'bcd' 的效果相同..
  • 我以为您只想对关键字使用单个字符。我将更新用作关键字的字符串
【解决方案5】:

怎么样:

List result = new ArrayList();
for(int i=0;i<s.length();i++) {
    if(s[i].startsWith(keyWord)) {
        result.add(s[i], 0);  // Adding to the beginning
    } else {
        result.add(s[i]);  // Adding to the end
    }
}

【讨论】:

  • 感谢您的努力,但我需要比较器和 sort() 方法。
【解决方案6】:

请检查以下内容

package com.pantech.sam.demos;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class SortArray {

/**
 * @param args
 */
private final static char keyWord = 'b';

public static void main(String[] args) {
    // TODO Auto-generated method stub
    String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};

    System.out.println("FIRST WAY " + sortArray(s));

    Arrays.sort(s, new CustomeComparator(keyWord));
    System.out.println("SECOND WAY" + Arrays.toString(s));

}

static List<String> sortArray(String[] sArray){
    Arrays.sort(sArray) ;
    List<String> l1 = Arrays.asList(sArray);
    List<String> l2 = new ArrayList<String>(l1.size());
    int index = 0;
    for (String str : l1) {
        if (str.charAt(0) == keyWord) {
            l2.add(index++,str); // add at start
        }else{
            l2.add(l2.size(), str); // add at end
        }

    }
    return l2;
}

}


class CustomeComparator implements Comparator<String> {
private final char keyWord;

CustomeComparator(char keyword2) {
    this.keyWord = keyword2;
}


@Override
public int compare(String o1, String o2) {
    // TODO Auto-generated method stub
      if(o1.charAt(0) == (keyWord)) {
            return o2.charAt(0) == (keyWord)? o1.compareTo(o2): -1;
        } else {
            return o2.charAt(0) == (keyWord)? 1: o1.compareTo(o2); 
        }   }
}

【讨论】:

    【解决方案7】:

    只是因为它更短:

    @Override
    public int compare(String o1, String o2) {
        boolean firstMatches = o1.startsWith(keyWord);
        boolean secondMatches = o2.startsWith(keyWord);
        if (firstMatches != secondMatches) {
            return firstMatches ? -1 : 1;
        }
        return 0;  // or refine the sort sort here
    }
    

    【讨论】:

    • 这会处理这个输出吗? [b, bc, bcd, z, c, asxdf, abcasdf, abasdf] 抱歉,这不起作用。
    • 对不起,这不起作用。
    • 抱歉,修正了错字(o1 使用了两次,o2 根本没有)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多