我有2个随机数的表,我想检查第一个表中哪个数字不存在于第二个表中并输出。
($0,$1,$2)
我目前的代码:
Example:
First table: 2, 6, 7, 9
Second table: 0, 6, 11, 3
Output: 2, 7, 9
我想问一下如何输出第一张表中但不是第二张表中的数字?
答案 0 :(得分:2)
你遇到的问题是你的表是二维数组,你试图将它们编入索引,好像它们是一维数组一样。
看看你是如何填补它们的:
TABLE1[i, j] = rnd.Next(1, 100);
TABLE2[i, j] = rnd.Next(1, 100);
您正在使用两个索引i
和j
(想想行和列)。
然而,稍后您正在做:
if (TABLE1[1] == TABLE2[i]) //where is the second index?
这显然是错误的,但不要让这项工作,让我们退后一步,再考虑一下。用两个索引来解决所有这些问题似乎有点......是的,笨蛋,难道不应该有更好的方法吗?
在您当前的问题中,表是多维的这一事实只是一种并没有真正增加任何价值的痛苦。如果你只需要返回第一个表中没有任何位置信息的第一个表中的元素,那么为什么所有这些都会让索引开始变得麻烦?让我们创建一个帮助方法来展平数组并使我们能够摆脱至少一个索引:
static IEnumerable<T> Flatten<T>(this T[,] array)
{
for (var i = 0; i < array.GetLength(0); i++)
for (var j = 0; j < array.GetLength(1); j++)
yield return array[i, j];
}
现在我们有了一维数组(IEnumerable<T>
s),我们可以利用C#的魔术棒...... LINQ!解决您的问题非常简单:
var notPresent = TABLE1.Flatten().Except(TABLE2.Flatten());
但如果阵列足够大,这可能会有糟糕的表现。记住如何手动解决这个问题(以及Except
如何做到这一点):从表1中取出第一个元素,检查表2中的所有元素,直到找到匹配或没有更多元素。从表1中取出第二个元素,检查表2中的所有元素,直到......等。这似乎很多工作,如果表很大,它会变得非常快。此外,如果你不聪明,你可能会做不必要的额外工作,因为表1和2可能包含重复的元素......
这可以改善吗?是的,有专门建立的集合,可以实现快速搜索; 集。在你的情况下,HashSet<int>
似乎是一个不错的选择。
您的代码现在看起来像:
var set = new HashSet<int>(TABLE1.Flatten());
var notPresent = set.Except(TABLE2.Flatten());
这会表现得更好。
答案 1 :(得分:1)
您可以将2D数组转换为列表,并使用LINQ TABLE1
查找TABLE2
中Except
中不存在的List<int> LIST1 = TABLE1.Cast<int>().ToList();
List<int> LIST2 = TABLE2.Cast<int>().ToList();
var result = LIST1.Except(LIST2);
数字:
<script src="https://aframe.io/releases/0.7.0/aframe.min.js"></script>
<a-scene antialias="true">
<a-sky src="static/home/hawaii.jpg"></a-sky>
<a-entity camera look-controls></a-entity>
<a-sphere color="red" radius="1" position="2 0 -5"></a-sphere>
</a-scene>