在java中为元组计数排序

时间:2010-01-24 01:42:19

标签: java sorting tuples

我正在构建一个具有字符串到整数映射的类。所以,如果我有3个苹果,我会将苹果映射到3个。

我需要编写一个类,通过减少数字来对对象的名称进行排序。

所以,如果我有

(苹果,3) (橘子,2) (香蕉,5)

我会得到的 (香蕉,5),(苹果,3),(橙子2)

我想知道是否已经有一个课程可以让我的生活更轻松或者我将如何实现这一点。

感谢。

3 个答案:

答案 0 :(得分:6)

您应该能够将对象(苹果,3)(橙子,2)(香蕉,5)放入List中,然后调用Collections.sort(yourlist)。然后,您需要确保您声明的对象实现了Comparable接口。

有关详情,请访问http://java.sun.com/docs/books/tutorial/collections/interfaces/order.html

假设您声明对象为

public class FruitAndCount implements Comparable<FruitAndCount> {
    private final String name;
    private final Integer count;

    public FruitAndCount(String name, int count) {
        this.name = name;
        this.count = count;
    }

    public String name() { return name;  }
    public int count()   { return count; }

    public int compareTo(FruitAndCount o) {
        return this.count.compareTo(o.count);
    }
}

然后,您应该能够进行以下调用,对您的列表进行排序:

FruitAndCount fruitArray[] = {
    new FruitAndCount("Apples", 3),
    new FruitAndCount("Oranges", 2),
    new FruitAndCount("Bananas", 5)
};

List<FruitAndCount> fruit = Arrays.asList(fruitArray);
Collections.sort(fruit);

然后你应该有一个分类的水果清单。

答案 1 :(得分:4)

能够创建类实现Comparable总是很好,但有时你不能,或者它是不可取的(例如,如果你需要能够以不同的方式比较相同的类型,基于不同的属性)。

在这种情况下,建议使用重载的Collections.sort()方法,该方法需要List<T>进行排序,并使用Comparator<T>来确定对象的排序方式。这比从旧元组中创建新元组要清晰得多,并且比实现Comparable(这也是一个有效的解决方案)更灵活。

答案 2 :(得分:2)

你真的想看看TreeMap

假设计数是唯一的,您只需反转元组,将计数作为键存储,将水果的名称存储为值。然后,TreeMap按键值存储按升序排序的项目,您可以返回值。由于排序是在插入时完成的,因此检索时间非常短。

如果您有非唯一计数,则可以使用easy solution here来利用TreeMap。