2012-10-10 53 views
1

我对Java Comparator接口有一些设计问题。根据另一个类中可用的参数对列表进行排序

我有一个包含一个简单的自定义数据结构的Set类:

class data { 
    Long ID; 
    int Priority; 
    ... 
} 

ID s为唯一的,所以可以使用ID‍‍‍‍‍对整个事件的数据。

和容器类:

class Container { 
    Set<data> mySet = ...; 
    List<Long> myList = ...; 
    ... 
} 

一些必然的原因,我需要保持一个排序dataList标识并行。我需要ListPriority排序。

因为Comparator应该比较Priority它应该实现Comparator<int>。但List仅包含ID s和Priority不可直接使用。

这是问题所在。 List中只有ID。因此,比较器类无权访问Priority

我该如何设计这样的概念?

+1

你想要橙汁,但你不提供橙子,是吧? – Juvanis

+0

哈哈,是的。但橙色在其他地方可用! :D 我只是不知道如何访问它! – MBZ

+0

你有你创建的实例列表吗? –

回答

1

你可以使用那些闻起来像高阶函数的东西。也就是说,建立一个静态函数,它将从Long到int(这是优先级)或数据的排序映射返回一个新的比较器。

Foo类有一个静态方法getComparator需要一个橙色。橙色是一个类,它有一个方法getPriority它采用ID返回相应的优先级。 getComparator方法构造新的Comparator对象。新的Comparator对象的compare方法需要两个ID。它查找两个ID的相应优先级并进行比较。

public interface Orange { 
    // Looks up id and returns the corresponding Priority. 
    public int getPriority(Long id); 
} 

public class Foo { 
    public static Comparator<Long> getComparator(final Orange orange) { 
     return new Comparator<Long>() { 
      public int compare(Long id1, Long id2) { 
       // Get priority through orange, or 
       // Make orange juice from our orange. 
       // You may want to compare them in a different way. 
       return orange.getPriority(id1) - orange.getPriority(id2); 
     }; 
    } 
} 

我的java有点生疏,所以代码可能有缺陷。不过,总体思路应该起作用。

用法:

// This is defined somewhere. It could be a local variable or an instance 
// field or whatever. There's no exception (except is has to be in scope). 
Collection c = ...; 
... 
Orange orange = new Orange() { 
    public int getPriority(Long id) { 
     // Insert code that searches c.mySet for an instance of data 
     // with the desired ID and return its Priority 
    } 
}; 
Collections.sort(c.myList, Foo.getComparator(orange)); 

我还没有得出了一个橙色如何看一个例子。

+0

我真的没有得到你的答案:(能否请你添加更多的细节? – MBZ

+0

是的,你能给什么缺少一些提示吗? – ReyCharles

+0

我加了一些命名我的问题,这将是非常好的如果你在我的命名中重写你的代码:) – MBZ

0

我假设你有一个List<Data>存储的地方。在比较,你需要从你的数据类中调用一个方法getDataById,并通过排序优先级..

检查下面的代码。我已经使用了许多通用型单级..

理想情况下,你会想分解成多个类别 ..但是,这仅仅是一个演示,如何实现你想要的..

class Container { 
    // List of Data instances created.. 
    // This list has to be static, as it is for a class, 
    // and not `instance specific` 
    public static List<Data> dataList = new ArrayList<Data>(); 

    // List of Ids, that you want to sort. 
    private List<Long> idList = new ArrayList<Long>(); 

    // Populate both the list.. 

    // Have a method that will iterate through static list to 
    // find Data instance for a particular id 

    public static Data getDataById(long id) { 
     // Find Data with id from the list 

     // Return Data 
    } 

    public void sortList() { 
     Collections.sort(idList, new MyComparator()); 
    } 
} 

public MyComparator implements Comparator<Long> { 

    public int compare(Long int1, Long int2) { 
     Data data1 = Container.getDataById(int1); 
     Data data2 = Container.getDataById(int2); 

     return data1.getPriority() - data2.getPriority(); 
    } 
} 
+0

感谢您的解决方案。但我无法将Container类重新定义为“Static”。 'List'在不同的实例中必须有所不同。 – MBZ

+0

@MBZ ..这是没有意义的..你怎么能有实例为每个实例创建一个不同的列表。没有创建的实例必须是相同的所有实例..其实这是特定类的.. –

+0

@MBZ ..而且你是不是让你的'Container'类的静态..但是,除非你使用一个数据库列表保存你的情况下'Static' ..不这样做,你不能达到你想要的.. –

相关问题