【问题标题】:Bucket Sorting or sorting an arraylist of objects based on Id? [duplicate]Bucket 排序或排序基于 Id 的对象数组列表? [复制]
【发布时间】:2013-08-06 11:03:42
【问题描述】:

我听说过Bucket Sorting。当我们对数百万条记录进行排序时,任何人都可以澄清它是如何提供最佳性能的吗?有n*log(n)O(n)的算法吗 ?

我有 1000 个员工对象,每个员工对象都有 id、name、salary 属性。我将这些对象添加到ArrayList 我想sort 这些对象基于 id 属性。到底有没有?不使用Collections.sort() 方法。考虑以下解决方案,请任何人帮助哪一个提供最佳性能?

谢谢

【问题讨论】:

  • 是的。它被称为 Comparable 和 Comparator,带有一点 Collections.sort :D
  • @Thihara 我的要求是不要使用 Collections.sort() 方法
  • My requirement is not to use Collections.sort() method。然而你忽略了在你的问题中提到这一点。
  • 在任何实际情况下,您可能应该使用Collections.sort()。如果是基础编程课程的作业,那么您可能应该自己实现一个排序算法(在这种情况下,像冒泡排序这样简单的东西通常就足够了)

标签: java sorting arraylist


【解决方案1】:

没有 Collections.sort() :

首先在 Employee 的类中实现 Comparable<Employee> 并覆盖 compareTo

@Override
public int compareTo(Employee o) {

    return this.id.compareTo(o.id);
}

将您的未排序列表传递给TreeSet 并获取set(按id 排序)然后使用此set 创建new List

List<Employee> list=new ArrayList<Employee>();
    list.add(new Employee(1, "A", Double.parseDouble("50")));
    list.add(new Employee(22, "B", Double.parseDouble("11")));
    list.add(new Employee(3, "C", Double.parseDouble("222")));
    list.add(new Employee(34, "D", Double.parseDouble("4")));

    SortedSet<Employee> set=new TreeSet<Employee>( list);

    List<Employee> l=new ArrayList<Employee>();
    l.addAll(set);

    System.out.println(l);

OutPut:在没有Collections.sort()的情况下按id排序

[Employee [id=1, name=A, price=50.0], Employee [id=3, name=C, price=222.0], Employee [id=22, name=B, price=11.0], Employee [id=34, name=D, price=4.0]]

编辑:

员工类:

class Employee implements Comparable<Employee>{

Integer id;
String name;
Double price;
       -------

}

【讨论】:

  • 我的 id 属性是整数而不是字符串,但是 compareTo() 方法只支持字符串比较。
  • return this.id.compareTo(o.id); 是使用String 的部分。如果你运用一些常识,这可以很容易地用整数比较代替。
  • 添加了 Employee 类,其中 integer 不是 String 。然而,compareTo 方法在 Integer、String 和 Date 类中被覆盖。请检查 API
【解决方案2】:
public class Employee implements Comparable<Employee> {

private int id;
private String name;
private String salary ;

public int compareTo(Employee val) {
      if(id>val.id){
      return 1;  
    }else if(id<val.id){
        return -1;
    } else {
        return 0;
    }
}

//getter and setters here
}

现在您可以创建一个列表

 List<Employee> emp= new ArrayList<Employee>();

现在你可以使用了

Collections.sort(emp); 

按id排序

【讨论】:

  • Employee.val 是什么意思?
  • 是的,这是一个错误,已更正。
  • 在我的情况下 id 不是 String 它是一个整数
  • @MaheshVarma 在这种情况下更改 compareTo 方法类似于我的答案
  • 谢谢。有什么方法可以在不使用 compareTo() 方法的情况下做到这一点?
【解决方案3】:

ArrayList 可以将元素存储在 ArrayFormat 中。如果您通过 id 识别用户员工,您可以使用使用键值对的HashTable 类,否则您可以使用 Comparable 接口实现您的类。

public class Employee implements Comparable<Employee> {

    private String id;
    private String name;
    private int salary ;

    public int compareTo(Employee val) {
        return id.compareTo(val.id);
    }

    // getter and setters here...

    List<Employee> emp = new ArrayList<Employee>();
    Collections.sort(emp);

【讨论】:

    【解决方案4】:
    My requirement is not to use Collections.sort() method
    

    在这种情况下,您需要使用一些现有的排序方式。如果集合是静态的(不再添加项目),我可以推荐使用快速排序或合并排序。如果要添加项目,堆排序或二进制排序可能是最好的方法。

    【讨论】:

      【解决方案5】:

      您可以使用此代码对列表进行排序:

      Collections.sort(list, new Comparator() {
          public int compare(Object a, Object b) {
              Employee ea = (Employee) a;
              Employee eb = (Employee) b;
              return ea.getID() - eb.getID();
          }
      }
      

      这使用Collections.sort 使用自定义比较器对列表进行排序,比较ID。

      如果您不能使用Collections.sort,那么您的老师肯定告诉过您如何对列表进行排序吗?也许在听课时专心听讲会有所收获。

      【讨论】:

        【解决方案6】:

        首先将其转换为您的班级列表:

        List<Employee> list = new List<Employee>(arraylist);
        
        var sorted = list.OrderBy(o => o.id).ToList();
        

        【讨论】:

        • is => 运算符适用于 jdk 6?
        • 更重要的是,List 是一个接口。你不能实例化它。 Java 中没有var。你的代码看起来像 C#。
        猜你喜欢
        • 2018-05-01
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        • 2017-02-21
        • 1970-01-01
        • 2016-09-28
        • 2015-01-23
        • 1970-01-01
        相关资源
        最近更新 更多