【问题标题】:Comparators sorting比较器排序
【发布时间】:2013-08-21 19:46:05
【问题描述】:

我不擅长比较器,但我需要学习它,到目前为止我已经做了很多,但我一直在 'System.out.println(compy("January", "March", "October ", "April"));'...请帮忙,我想要一个修复的解释。谢谢!

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Months {
    public static void main (String args[]){

        System.out.println(Comp("January","May"));
        System.out.println(Comp("October", "May"));
        System.out.println(Comp("August","August"));
        System.out.println(Comp("January", "March"));

        System.out.println(compy("January", "March", "October", "April"));
    }

    static int Comp(String s1, String s2){

        while (true){
            int r = 0;
            int s = 0;

            if(s1.equals("January")){
                r=1;
            }

            if(s1.equals("February")){
                r=2;
            }

            if(s1.equals("March")){
                r=3;
            }

            if(s1.equals("April")){
                r=4;
            }

            if(s1.equals("May")){
                r=5;
            }

            if(s1.equals("June")){
                r=6;
            }

            if(s1.equals("July")){
                r=7;
            } 

            if(s1.equals("August")){
                r=8;
            }

            if(s1.equals("September")){
                r=9;
            }

            if(s1.equals("October")){
                r=10;
            }

            if(s1.equals("November")){
                r=11;
            }

            if(s1.equals("December")){
                r=12;
            }

            if(s2.equals("January")){
                s=1;
            }

            if(s2.equals("February")){
                s=2;
            }

            if(s2.equals("March")){
                s=3;
            }

            if(s2.equals("April")){
                s=4;
            }

            if(s2.equals("May")){
                s=5;
            }

            if(s2.equals("June")){
                s=6;
            }

            if(s2.equals("July")){
                s=7;
            }

            if(s2.equals("August")){
                s=8;
            }

            if(s2.equals("September")){
                s=9;
            }

            if(s2.equals("October")){
                s=10;
            }

            if(s2.equals("November")){
                s=11;
            }

            if(s2.equals("December")){
                s=12;
            }

            if(r<s){
                return -1;
            }

            if(r>s){
                return 1;
            }
            if(r==s){
                return 0;
            }

        }   

    }

    public class Comp implements Comparator {
        public int compare(Object o1, Object o2){
            return Comp((String)o1, (String)o2);
        }
    }

    void sort(List l){
        Comparator compy = new Comp();
        Collections.sort(l, compy);
    }

}

【问题讨论】:

  • 你的方法Comp应该重命名为comp。在 java 中,方法名称以小写字母开头,按照惯例,后面的单词要大写。我不认为这是错误,但它确实让我感到困惑。
  • 顺便说一句,使用数组和indexOf()
  • 枚举可能会有所帮助。
  • 您实际上在哪里调用 sort 方法(它会创建您的代码找不到的 compy 对象)?
  • 这段代码有很多问题。你有一个静态方法和一个同名的类,一个创建这个你永远不会引用的 compy 的方法和一个用于比较的返回语句,这没有多大意义。重新开始,慢慢来,一点一点地积累。

标签: java string sorting comparator


【解决方案1】:

包含实际错误会有所帮助。

在我看来,错误是您在排序方法中使用了一个变量。来自 main 方法。

试试类似的东西

package com.example;

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

public class HomeWork {

  public static void main(String args[]) {
    MonthComparable compy = new MonthComparable();
    List<String> myList = Arrays.asList(new String[] {"May", "June", "April"});
    Collections.sort(myList, compy);
    System.out.println();
  }

  public static class MonthComparable implements Comparator<String> {

    @Override
    public int compare(String left, String right) {
      Integer leftValue = monthValue(left);
      Integer rightValue = monthValue(right);
      return leftValue.compareTo(rightValue);
    }

    private static int monthValue(String left) {
      // TODO Implement this
      return 0;
    }
  }
}

【讨论】:

  • 您的回复内容更适合作为评论而不是答案。不过,我知道你可能还没有评论权。
【解决方案2】:

Ravi Thapliyal 为您提供了很好的解决方案,但如果我能提出建议,请更改您的比较器

public class Comp implements Comparator<String> {

   private List<String> months = Arrays.asList("January" , "February",...);

    @Override
    public int compare(String s1, String s2) {
        return months.indexOf(s1)-months.indexOf(s2);
    }
}

它更短更易读

【讨论】:

    【解决方案3】:

    这是您可以使用代码对列表进行排序的方法。

    List<String> list = new ArrayList<String>();
    
    list.add("March");
    list.add("January");
    list.add("October");
    list.add("April");
    
    System.out.println("Before sort: " + list);
    // prints: Before sort: [March, January, October, April]
    
    new Months().sort(list); // sort
    
    System.out.println("After sort: " + list);
    // prints: After sort: [January, March, April, October]
    

    【讨论】:

    • @AndrewMartin 实际上,我会替换每个使用 Map&lt;Integer, String&gt; map 的比较器的整个实现,其中地图每月存储它,它是 key
    • @LuiggiMendoza:更好!
    • @LuiggiMendoza 是的,OP 的代码还有更多问题,但我唯一关注的是 OP 如何使用 他的 代码进行排序。 @AndrewMartin,JDK 8 带有 java.time.Month 枚举。那会好一百倍。 :)
    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 2020-10-08
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多