【问题标题】:Better optimization更好的优化
【发布时间】:2015-05-17 20:36:52
【问题描述】:

我正在编写一段编译良好但有点草率且可以优化的代码。有没有更好或更简单的方法来做到这一点。我是否以正确的方式使用 compareTo() 方法?我正在尝试使用不同的方法使代码比下面的示例更简洁、更快。

import java.util.ArrayList;

public class Sort {

    public ArrayList<Name> sort(ArrayList<Name> names) {

        ArrayList<Name> results;
        results = new ArrayList<Name>(); 

        do {
            Name firstName = new Name("zzz", "zzz");
            for (int i = 0; i < names.size(); i++)
                if (names.get(i).getFirstName()
                        .compareTo(firstName.getFirstName()) < 0
                        || names.get(i).getFirstName() == firstName
                                .getFirstName() && names.get(i).getSurName()
                                .compareTo(firstName.getSurName()) < 0)
                firstName = new Name(names.get(i).getFirstName(), 
                                names.get(i).getSurName());

            results.add(firstName);
            names.remove(firstName);
        } while (names.size() > 0);

        return results;
    }

}


class Name {
    private String firstName; 
    private String surName;

    public Name() {
    }

    public Name(String firstName, String surName) {
        this.firstName = firstName;
        this.surName = surName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurName() {
        return surName;
    }

    public void setSurName(String surName) {
        this.surName = surName;
    }

    public String toString() {
        return firstName + " " + surName;
    }

    public boolean equals(Object other) {
        return firstName == ((Name) other).firstName
                && surName == ((Name) other).surName;
    }



}

【问题讨论】:

  • 如果你必须使用选择排序,因为这是家庭作业,它并不意味着高效。如果你想要效率,我建议你使用 List 的内置排序例程。例如Collections.sort(list, your-custom-comarator)

标签: java optimization arraylist


【解决方案1】:

有没有更好或更简单的方法来做到这一点。我是否以正确的方式使用 compareTo() 方法?

是的几个问题:

  • 比较字符串应该使用equals方法而不是==firstName == ((Name) other).firstName
  • 从外观上看,您正在尝试对名称列表进行排序。您可能正在使用 O(N^2) 时间进行操作。使用 JDK 的排序,您可以在 O(NlogN) 时间内完成相同的操作,从而使其比目前的情况更糟。

所以改为定义自己的比较器并像这样使用它:

Collections.sort(names, new MyNamesComparator());

【讨论】:

    【解决方案2】:

    如果你想要效率,我建议你使用O(N * log N)的内置排序

    // in Java 7
    Arrays.sort(names, new Comparator<Name, Name>()) {
         public int compare(Name n1, Name n2) {
             int cmp = n1.firstName.compareTo(n2.firstName);
             if (cmp == 0)
                 cmp = n1.lastName.compareTo(n2.lastName);
         }
    });
    
    // in Java 8
    names = names.stream()
                 .sorted(Comparator.comparing(Name::getFirstName)
                                  .andThen(Name::getLastName))
                 .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 2011-11-06
      • 1970-01-01
      • 2010-11-14
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2012-07-17
      相关资源
      最近更新 更多