2012-10-11 71 views
0

在android中,如何根据优先级对单个行中的多个值进行排序,类似于Excel中的排序功能?多值多优先级排序图

Map<String,String,Float,Integer> shoes; // Style, Color, Price, Quantity 
shoes.put("Boots","Red",15.50,5); 
shoes.put("Boots","Green",17.50,2); 
shoes.put("Skate","Red",12.25,6); 
shoes.put("Skate","Blue",13.05,9); 
shoes.Sort(1,0,2,3); // sorts by color, then by style 

shoes.Sort(2,0,1,3); // sorts by price, then by style 
+2

你确定你没有想创建一个Shoes对象并使用[Comparators](http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html)? – Thomas

+0

我接受所有建议。任何代码示例都会有很大帮助。 –

回答

0

还有的覆盖设置一个一般比较示例代码here好块。对多个列进行排序将需要多次调用,但会产生所需的效果。从Collections spec

This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort. 

所以,你开始用鞋

public class Shoe 
{ 
    String style; 
    String color; 
    float price;//There are some reasons to not use float for money, google has lots of blogs etc 
    int quantity; 
} 

然后根据上面链接教程,并最终你的比较:

ArrayList<Shoe> shoes = makeShoes(); 
Collections.sort(shoes,col1Comparator); 
Collections.sort(shoes,col2Comparator); 
Collections.sort(shoes,col3Comparator); 
+0

这是一个不错的链接,但它似乎做这个简单的任务将需要超过50行代码。 –

+0

这是一个旨在处理潜在复杂情况的解决方案。你的特定目标是最简单的目标之一,这就是为什么它很好地匹配链接教程,但看起来像矫枉过正。同样的结构可以用来按鞋子的颜色来分类说一套衣服(有鞋子)。或者对没有默认排序的东西进行排序,比如比较中定义的按幸福进行排序的人。如果您的问题用电子表格/数据库更好地解决,您应该将其视为替代方案。 – Thomas

+0

我发现将CSV值转换为1D数组更简单,对数组进行排序,然后展开值。希望有一个圆滑的解决方案,但是,唉,这么多灵魂属于你。 –

0

由恺提出的建议是正确的,但是,你可以做这样的事情:

  1. 创建一个类(内部或不)实现接口比较,它应该作为推断类型与您想要比较的内容相关。
  2. 创建一个具有相同规格的Map和比较器作为参数的新TreeSet
  3. 将所有对象放入创建的treeseet中。

看这个线程:Sort a Map<Key, Value> by values (Java)

但同样,你应该考虑创建一个类你的需要。

[]中 内托