【问题标题】:Sort objects quickly based on specified order of their property names根据属性名称的指定顺序快速排序对象
【发布时间】:2014-03-01 05:47:50
【问题描述】:

我有一个包含这种类型对象的列表

class Element 
{
     String description; 
     ...
}

这些对象包含在一个列表中。

List<Element> elements = ...

此列表将根据Element 对象的description 属性按升序排序。

Element 对象只能有标准的描述,需要按照指定的顺序进行排序 -

descE
descA
descK
descB
descF
...

为了让这个排序更快,我目前的计划如下——

使用Comparator&lt;Element&gt;,这样我就可以使用Collections.sort(list,comparator) 函数。将标准描述存储在 HashMap 中

HashMap<String, Integer> descriptionOrder = new HashMap<String, Integer>();
descriptionOrder.put("descE", 0);
descriptionOrder.put("descA", 100);
descriptionOrder.put("descK", 200);
descriptionOrder.put("descB", 300);
descriptionOrder.put("descF", 400);

我添加了一个 100 的缓冲区,以防以后需要在两个元素之间添加更多描述。

public int compare(Element a, Element b)
 {
       int valueForA = descriptionOrder.get(a.getDescription());
       int valueForB = descriptionOrder.get(b.getDescription());

       return (valueForA - valueForB); 
 }

我的问题是,有没有更快或更有效的方法来做到这一点?

【问题讨论】:

  • 您打算如何填充订单?
  • 你是说HashMap?手动,在代码中。
  • 您的收藏中大概有多少件?如果它是一个小数字,速度很可能并不重要。
  • @MartinCarney,在我的情况下,项目不会超过 30 或 40,但假设还有更多,如何提高效率?
  • 听起来您正在尝试进行微优化,这几乎不值得。不过,我可能只是误解了您要完成的工作。

标签: java sorting data-structures


【解决方案1】:

我认为你有什么是好的。

但是,您可能需要考虑 List 可以包含空值,并且您可能希望在比较方法中处理空值。这样您就可以确定比较是如何满足空值的。

【讨论】:

    【解决方案2】:

    由于您的密钥是一个字符串,您可以使用 TreeMap。这将按字母顺序按键名排序。

    【讨论】:

      【解决方案3】:

      如果您打算创建一个单独的 Comparator 类来定义 Element 类的对象之间的比较,那么您可以使用 Collections.sort 对您的 Arraylist 进行排序。

        Comparator<Elements> comparator = new ElementsComparator<Elements>();
        Collections.sort (elements, comparator); 
      

      这是相同的链接:enter link description here

      【讨论】:

        【解决方案4】:

        不确定您是否绝对要求描述为字符串类型。

        你总是可以按如下方式上课。

        class Description implements Comparable<Description> {
           private final String name;
           private final int precedence;
        
           // rest of the Code
        
        }
        
        class Element implements Comparable<Element> {
           private Description desc;
           // rest of the code.
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-07
          • 1970-01-01
          • 2021-02-11
          • 1970-01-01
          • 2018-05-01
          • 2016-05-18
          • 2015-02-19
          相关资源
          最近更新 更多