如果我有下一个数组:内部数组C#微调空间(除去0的)
int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 };
我如何才能将所有不等于0离开,因为他们可以让阵列将建成类似的值这个:
int[] arr = { 123, 243, 123, 123, 0, 0, 0, 0, 0 };
谢谢!
如果我有下一个数组:内部数组C#微调空间(除去0的)
int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 };
我如何才能将所有不等于0离开,因为他们可以让阵列将建成类似的值这个:
int[] arr = { 123, 243, 123, 123, 0, 0, 0, 0, 0 };
谢谢!
排序依据:
int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 }.OrderBy(x => x == 0).ToArray();
另一个不错的!布尔的顺序是错误的,那么这是真的,所以这个工作! +1 – 2012-02-07 15:31:42
如何使用LINQ:
var result = arr.Where(x => x != 0).Concat(arr.Where(x => x == 0)).ToArray();
这非常具有可读性,具有线性时间复杂度。另一方面,它运行不正确,需要两次输入。
不错,非常优雅! +1 – 2012-02-07 15:24:31
创建一个新数组并将值传递给它。
int[] newArr = new int[arr.Length];
int i = 0;
foreach (var v in arr)
{
if (v != 0)
{
newArr[i++] = v;
}
}
arr = newArr;
由于int
为值类型的阵列与所有零初始化。然后,我们一次只复制一个值,如果值不为0,则只增加目标索引i
。比所示的Linq示例更详细,并且决定不冷却。但如果你是一名学生,可能会更容易遵循。
试试这个:
arr.OrderBy(x=>x == 0).ToArray();
也许使用LINQ有:
int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 };
arr = arr.OrderByDescending(a => a > 0).ToArray<int>();
所有的答案到目前为止创建一个新的阵列。真的,你可以只在一个循环中移动项目,然后用0填充剩下的项目。
public static void ShiftZerosRight(this int[] arr)
{
int j = 0;
while (j < arr.Length && arr[j] != 0)
{
j++;
}
for (int i = j; i < arr.Length; i++)
{
if (arr[i] != 0)
{
arr[j++] = arr[i];
}
}
while (j < arr.Length)
{
arr[j++] = 0;
}
}
不优雅作为单线LINQ表达式,但更有效 - 这不会产生任何新的对象(和LINQ创建几个和最终新的数组),这是一个单次穿过所述阵列。作为扩展方法的复杂性是没有看到在主体其中它可以被用作:
int arr[] = { ... };
arr.ShiftZerosRight();
这段代码不起作用。如果数组0有启动arr [j]!= 0,这将在第一步失败 – Peru 2017-02-17 01:12:23
此代码段不会创建另一个array.Here“×[]”是您的阵列。您取第一个0值并将其替换为非零数字。
int i=0,j=0,index=0,temp=0;
for(i=0;i<x.length;i++)
{
if(x[i]==0)
{
index=i;
for(j=index;j<x.length;j++)
{
if(x[j]!=0)
{
temp=x[j];
x[j]=x[i];
x[i]=temp;
break;
}
}
}
}
这功课吗? – 2012-02-07 15:22:21
我会进行某种泡沫排序。如果这就是你所要求的,那么没有内建的呼叫。 – 2012-02-07 15:23:32