【问题标题】:Nested Sorting in Java List based on two elements Using ComparatorJava列表中基于两个元素的嵌套排序使用比较器
【发布时间】:2015-01-24 22:43:24
【问题描述】:

我有一个 java 列表,我需要在向其中添加对象后对其进行排序。该对象具有三个元素。一个字符串和两个整数。类如下:-

public class ValueWords implements Comparable<ValueWords>{

//.............................................

public static final Comparator<ValueWords> valComparator = new Comparator<ValueWords>()
 {@Override
    public int compare(ValueWords v1, ValueWords v2) {
        return v1.valWord   - v2.valWord; }
   }
};
//....................................................................
private String strWord;
private int valWord;
private int phraseWord;
public int getPhraseWord() {
    return phraseWord;}
public void setPhraseWord(int phraseWord) {
    this.phraseWord = phraseWord;}
public String getStrWord() {
    return strWord;}
public void setStrWord(String strWord) {
    this.strWord = strWord;}
public int getValWord() {
    return valWord;}
public void setValWord(int valWord) {
    this.valWord = valWord;}
public ValueWords() {}

@Override
public int compareTo(ValueWords arg0) {
    // TODO Auto-generated method stub
    return 0;}
//..............................................
}

我这样称呼它

 Collections.sort(valWordList,ValueWords.valComparator);

它给了我如下排序列表:-

 ---------------------------------------------
   strWord     valWord      phraseWord
   abcd          0             1
   abcde         0             0
   mns           1             2 
   efgh          1             1
   xyz           2             2
   zxx           2             0
  --------------------------------------------

我想要一个嵌套排序,例如:-

  ---------------------------------------------
   strWord     valWord      phraseWord
   abcde        0             0
   abcd         0             0
   efgh         1             1 
   mns          1             2
   zxx          2             0
   xyz          2             2
  --------------------------------------------

我做了一些徒劳的尝试,但对 java 来说是新手。他们没有工作。而且它们很安静,可以放在这里。

【问题讨论】:

  • 不清楚您希望如何对事物进行排序,显然是按 valWord,然后是 phraseWord,然后是 strWord?看起来很简单。
  • 先生 valWord 然后是phraseWord。
  • 进行第一次比较。如果它们不相等,则完成,返回该比较的结果。如果相等,则返回第二次比较的结果。

标签: java list sorting comparator


【解决方案1】:

您可以将两者结合在一个比较器中:

public static final Comparator<ValueWords> valComparator = new Comparator<ValueWords>()
{
    @Override
    public int compare(ValueWords v1, ValueWords v2) {
        int result = Integer.compare(v1.valWord, v2.valWord);
        return result == 0 ? Integer.compare(v1.phraseWord, v2.phraseWord) : result;
    }
};

在 java 8+ 中,您还可以使用 Comparator.thenComparing 组合 2 个比较器:

valComparator = ((Comparator<ValueWords>) (v1, v2) -> Integer.compare(v1.valWord, v2.valWord))
                                         .thenComparing((v1, v2) -> Integer.compare(v1.phraseWord, v2.phraseWord));

【讨论】:

    【解决方案2】:

    尝试更改比较器以检查这两个值:

    public static final Comparator<ValueWords> valComparator = new Comparator<ValueWords>() {
        @Override
        public int compare(ValueWords v1, ValueWords v2) {
            if(v1.valWord == v2.valWord)
                return v1.phraseWord - v2.phraseWord;
            else 
                return v1.valWord - v2.valWord;
        }
    };
    

    【讨论】:

    • 使用Integer.compare 而不是仅仅减去整数也会允许差异溢出的整数对。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多