列出物品订购问题

时间:2011-02-24 05:01:17

标签: java algorithm

我有一个项目列表和一组用户。用户可以重新排序列表项。每个用户都有自己的列表视图,他可以用自己的方式安排项目。可以将一个项目放置在列表中的不同位置以供不同用户使用。我要在列表项中跟踪用户的项目位置。请提出实施此建议。列表的大小不是恒定的。我正在使用Java。我的意图是我必须以其订购格式显示每个用户的列表。请大师给我一个建议。

3 个答案:

答案 0 :(得分:1)

您可以保留一个有序列表,以及从主列表中检索项目的顺序:

List<Foo> items = new ArrayList<Foo>();
// add stuff to items (say, 6 things)

Map<String,List<Integer>> userOrders = new HashMap<String,List<Integer>>();
userOrders.put("A", Arrays.asList(0,1,2,3,4,5)); // add user A's order
userOrders.put("B", Arrays.asList(5,4,3,2,1,0)); // add user B's order

// display for userA:
for(Integer i : userOrders.get("A")){
    show(items.get(i)); // show the userA's i-th item
}

我在这里也使用Map来保存订单。根据您的应用程序,您可能会使用其他方案来检索用户的自定义排序,但原则将始终相同:如果用户可以拥有自定义订单,则应将订购存储在某处,并且然后根据该顺序迭代事物列表(如上所示)。

同时注意您使用的List类型,在get上调用LinkedList进行随机访问的费用远远高于ArrayList。< / p>

答案 1 :(得分:1)

为什么不按照glowcoder的建议首先进行经典的面向对象设计。然后你将拥有User类和Item类。用户类将具有Item实例的列表。

class User{
  String userId;
  List<Item> userItems;
}

反向结构也会反映在数据库中(用户表,项目表和具有前两个表的外键映射的用户项表)。 Mark建议的List of List解决方案有效,但在Java等面向对象语言中并不是“正确”的方法。

答案 2 :(得分:0)

您有一个位置存储实际的项目列表。然后每个用户获得他们自己的数据模型。它由实际列表支持,但模型更多地是每个项目的实际索引与用户对项目的显示索引之间的映射。然后,您有一个查看器可以使用该模型在GUI中显示列表。就观众而言,模型告诉它正确的索引。但该模型允许从显示的顺序转换为实际顺序。当用户通过视图操作列表时,您更新索引图并且从不触摸实际数据。