【发布时间】:2011-04-10 21:52:51
【问题描述】:
我们有两个列表,比如说学生和他们的分数。我想比较这两个列表并找到新列表和旧列表之间的增量,然后找到将任何更改插入或更新到新列表中的侵入性最小的方法。解决这个问题的最佳算法是什么?希望专注于对新列表和性能的最小更改。
示例代码:
List<ListItem> existingList = new List<ListItem>();
List<ListItem> newList = new List<ListItem>();
public TopLists()
{
InitTwoLists();
}
private void InitTwoLists()
{
existingList.Add(new ListItem { Name = "Shane", Score = 100 });
existingList.Add(new ListItem { Name = "Mark", Score = 95 });
existingList.Add(new ListItem { Name = "Shane", Score = 94 });
existingList.Add(new ListItem { Name = "Steve", Score = 90 });
existingList.Add(new ListItem { Name = "Brian", Score = 85 });
existingList.Add(new ListItem { Name = "Craig", Score = 85 });
existingList.Add(new ListItem { Name = "John", Score = 82 });
existingList.Add(new ListItem { Name = "Steve", Score = 81 });
existingList.Add(new ListItem { Name = "Philip", Score = 79 });
existingList.Add(new ListItem { Name = "Peter", Score = 70 });
newList.Add(new ListItem { Name = "Shane", Score = 100 });
newList.Add(new ListItem { Name = "Steve", Score = 96 }); // This is change
newList.Add(new ListItem { Name = "Mark", Score = 95 });
newList.Add(new ListItem { Name = "Shane", Score = 94 });
newList.Add(new ListItem { Name = "Brian", Score = 85 });
newList.Add(new ListItem { Name = "Craig", Score = 85 });
newList.Add(new ListItem { Name = "John", Score = 82 });
newList.Add(new ListItem { Name = "Steve", Score = 81 });
newList.Add(new ListItem { Name = "Philip", Score = 79 });
newList.Add(new ListItem { Name = "Peter", Score = 70 });
}
}
public void CompareLists()
{
// How would I find the deltas and update the new list with any changes from old?
}
}
public class ListItem
{
public string Name { get; set; }
public int Score { get; set; }
}
** 编辑:所需的输出 ***
所需的输出是用增量实际更改 newList。 例如在这种情况下:
newList.Add(new ListItem { Name = "Shane", Score = 100 });
newList.Add(new ListItem { Name = "Steve", Score = 96 }); // This is change
newList.Add(new ListItem { Name = "Mark", Score = 95 });
newList.Add(new ListItem { Name = "Shane", Score = 94 });
newList.Add(new ListItem { Name = "Brian", Score = 85 });
newList.Add(new ListItem { Name = "Craig", Score = 85 });
newList.Add(new ListItem { Name = "John", Score = 82 });
newList.Add(new ListItem { Name = "Steve", Score = 81 });
newList.Add(new ListItem { Name = "Roger", Score = 80 }); // Roger is a new entry
newList.Add(new ListItem { Name = "Phillip", Score = 79 }); // Philip moved down one
// Peter 以 70 分从这个列表中掉了出来,因为我只想要前 10 名。
因此更改将是:
更新“史蒂夫”的记录 2,分数发生了变化 在位置 9 插入新记录“Roger” 将“彼得”的记录从前 10 名中删除。
【问题讨论】:
-
您在寻找通用解决方案吗?或者是否存在某些限制,例如列表的特定排序顺序?
-
我们应该假设列表的大小相同吗?您是否还想在列表 A 中查找不在列表 B 中的成员,反之亦然?
-
通用解决方案。列表总是相等的。排序顺序始终是分数降序的排序。
-
结果应该是什么格式?
-
我不明白。你有一个旧列表和新列表。您想查找增量、应用到旧列表、获取新列表吗?输出是从旧列表再次构建的新列表并找到增量?
标签: c# algorithm computer-science