【问题标题】:Compare two arrays or arraylists, find similar and different values比较两个数组或数组列表,找到相似和不同的值
【发布时间】:2010-07-19 19:19:03
【问题描述】:

我有两个字符串数组(或数组列表,如果更简单的话)。我需要比较这些,找出哪些只存在于第一个数组中,哪些存在于两者中,哪些只存在于第二个数组中。这些数组的长度不同,并且可能有不同的顺序。如果有必要,我想我可以对它们进行排序......

我知道我可以一起解决这个问题,但我认为这可能有一个相当标准和有效/“最佳”的解决方案,我比什么都好奇。

我为此使用 c#,但如果您想用另一种语言编写解决方案,欢迎提供任何帮助。

感谢您的帮助!

【问题讨论】:

  • 在这里查看 Linq 101 示例,它们应该会有所帮助(尤其是集合运算符):msdn.microsoft.com/en-us/vcsharp/aa336746.aspx
  • 不,这不是作业哈哈。我只知道有一种比我在大约 20 分钟内想出的更酷/更有效的方法。我以前没有使用过 Linq,但这可能是深入研究它的最佳时机。谢谢你的建议。
  • Linq 工作得很好!我使用 except 和其他集合运算符。现在看起来并不太慢,但我也可以尝试将它们变成哈希集。

标签: c# arrays comparison arraylist compare


【解决方案1】:

如果数组很大,那么您需要使用对这些操作有效的数据结构;数组不是。

如果数组大小为 n,则简单的解决方案是 O(n^2)。

如果你对数组进行排序,那么你可以对它们进行二进制搜索;排序可能是 O(n lg n) 并且以每次搜索 lg n 的成本搜索 n 次也将是 O(n lg n) 时间。

如果您首先将每个数组转换为HashSet<T>,那么您可以在 O(n) 时间和 O(n) 额外空间内完成。

【讨论】:

  • 我从未使用过哈希集,但我很好奇,我会研究一下,谢谢!
  • @Wes:@Brian:它被称为 HashSet 而不是更合理的名称“Set”,因为……等等……因为“Set”是 Visual 的一个关键字基本.
【解决方案2】:
var onlyinfirst = from s in list1 where !list2.Contains(s) select s;
var onlyinsecond = from s in list2 where !list1.Contains(s) select s;
var onboth = from s in list1 where list2.Contains(s) select s;

【讨论】:

  • 这是我想出的。我只是想有一些不错的 c# / .net 方法可以使用可比较的东西或其他东西。我也会尝试一些 linq,但如果所有其他方法都失败了,这将起作用。
  • 请注意,如果列表的大小为 n 和 m,那么这些解决方案都是 O(n*m)。如果 m 和 n 很大,则存在更有效的解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-09-19
  • 2016-04-07
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2019-01-08
相关资源
最近更新 更多