数组中重复的项去除怎么做?

时间:2021-03-14 11:17:11
一个数组:
{1,1,1,2,2,2,3,3,3}
我要去除重复的项怎么去掉?
因为重复的次数不定,有可能是三个,有可能是四个。而且维数也不定。
怎么办?

14 个解决方案

#1


我的想法是:先把数组的值做一个排序,然后前一项与它的后一项比较,如果相同则删掉一项,然后再比较后一项与它的下一项的值,依次比较到末尾。

#2


我也是这样想的,但是做起来做不到啊。

#3


如果重复的项是连续的话:可以按如下方法进行去除:
假设原来数组长度为number;
for(int i=0;i<number;i++)
{
   for(int j=0;j<i;j++)
  { 
    if(a[j]==a[i])
    { 
      for(int h=j;h<i;h++)
         a[h]=a[h+1];//j以后的项都往前移一格
      number--; //原来数组长度减1
   }
}

#4


to:lrxz(九月鹰飞),是什么做不到?在排序时你的数组还确定不了?
你先根据你的数据特点,选择一种效率高的排序方法进行排序。然后再依次比较前后项的值,删除重复项。

#5


定义一个数组:b[a.Length]
遍历数组a,对每一个a[i],判断是否在b中

if a[i]在b中,继续
else 把a[i]加到b中,
共比较次数:
set n=a.Length
比较次数=0+1+2+……+(n-1)=(n-1)*(n-2)

#6


public static int[]  RemoveDup(int[] myData)
 {
if (myData.Length > 0)
{
Array.Sort(myData);

int size = 1; //at least 1
for (int i=1; i<myData.Length; i++)
     if (myData[i] != myData[i-1])
             size++;

int[] myTempData = new int[size];

int j=0;

myTempData[j++] = myData[0];

for (int i=1; i<myData.Length; i++)
     if (myData[i] != myData[i-1])
             myTempData[j++] = myData[i];

return myTempData;
}

return myData; 
 }


int[] myData = {1,1,1,5,2,2,2,3,3,3,4};
myData = RemoveDup(myData);
foreach (int x in myData)
  Console.WriteLine(x);

#7


嗯 同意 howbigsea(大海)

#8


楼上诸位给的算法都可以.如果你学过数据结构,可以自己设计算法,个人比较喜欢二分查找.

#9


saucer(思归, .NET MVP)和howbigsea(大海)的方法都可以。
我的算法中,数组经过排序后,如果第一项与第二项相等,则删除第二项,然后“比较项”还是第一项,即再下一轮比较时,比较第一项和第三项,如果不等,则游标下移,“比较项”为第三项,依次比较
个人认为(n-1)*(n-2)的比较次数还是太多。因为排序的比较次数(依排序方法而定)再加上数组一趟比较的次数(n-1)应该比(n-1)*(n-2)小(当n大于一定值时)
以上观点是个人感觉,有错则请指正

#10


同意wacle([Smile!])的思路。自己设计算法的话,我认为howbigsea(大海)的算法:
定义一个数组:b[a.Length]
遍历数组a,对每一个a[i],判断是否在b中
在判断是否在b中时用二分法的查找应该是比较好的算法

#11


向高手学习

#12


int[] original=new int[]{1,1,1,2,2,2,3,3,3};
Hashtable ht=new Hashtable();
for (int i=0;i<original.Length;i++)
{
if (ht[original[i].ToString()]==null)
ht[original[i].ToString()]=original[i];
}

&Ocirc;&Ugrave;±é&Agrave;úht&frac34;&Iacute;&sup3;&Eacute;&Aacute;&Euml;

#13


&Ocirc;&Ugrave;±é&Agrave;úht&frac34;&Iacute;&sup3;&Eacute;&Aacute;&Euml;
是这个玩意:
再遍历ht就成了

#14


也可以建一个临时表,先用SQL的distinct功能去掉相同的项目,返回的记录集放入数组内。

#1


我的想法是:先把数组的值做一个排序,然后前一项与它的后一项比较,如果相同则删掉一项,然后再比较后一项与它的下一项的值,依次比较到末尾。

#2


我也是这样想的,但是做起来做不到啊。

#3


如果重复的项是连续的话:可以按如下方法进行去除:
假设原来数组长度为number;
for(int i=0;i<number;i++)
{
   for(int j=0;j<i;j++)
  { 
    if(a[j]==a[i])
    { 
      for(int h=j;h<i;h++)
         a[h]=a[h+1];//j以后的项都往前移一格
      number--; //原来数组长度减1
   }
}

#4


to:lrxz(九月鹰飞),是什么做不到?在排序时你的数组还确定不了?
你先根据你的数据特点,选择一种效率高的排序方法进行排序。然后再依次比较前后项的值,删除重复项。

#5


定义一个数组:b[a.Length]
遍历数组a,对每一个a[i],判断是否在b中

if a[i]在b中,继续
else 把a[i]加到b中,
共比较次数:
set n=a.Length
比较次数=0+1+2+……+(n-1)=(n-1)*(n-2)

#6


public static int[]  RemoveDup(int[] myData)
 {
if (myData.Length > 0)
{
Array.Sort(myData);

int size = 1; //at least 1
for (int i=1; i<myData.Length; i++)
     if (myData[i] != myData[i-1])
             size++;

int[] myTempData = new int[size];

int j=0;

myTempData[j++] = myData[0];

for (int i=1; i<myData.Length; i++)
     if (myData[i] != myData[i-1])
             myTempData[j++] = myData[i];

return myTempData;
}

return myData; 
 }


int[] myData = {1,1,1,5,2,2,2,3,3,3,4};
myData = RemoveDup(myData);
foreach (int x in myData)
  Console.WriteLine(x);

#7


嗯 同意 howbigsea(大海)

#8


楼上诸位给的算法都可以.如果你学过数据结构,可以自己设计算法,个人比较喜欢二分查找.

#9


saucer(思归, .NET MVP)和howbigsea(大海)的方法都可以。
我的算法中,数组经过排序后,如果第一项与第二项相等,则删除第二项,然后“比较项”还是第一项,即再下一轮比较时,比较第一项和第三项,如果不等,则游标下移,“比较项”为第三项,依次比较
个人认为(n-1)*(n-2)的比较次数还是太多。因为排序的比较次数(依排序方法而定)再加上数组一趟比较的次数(n-1)应该比(n-1)*(n-2)小(当n大于一定值时)
以上观点是个人感觉,有错则请指正

#10


同意wacle([Smile!])的思路。自己设计算法的话,我认为howbigsea(大海)的算法:
定义一个数组:b[a.Length]
遍历数组a,对每一个a[i],判断是否在b中
在判断是否在b中时用二分法的查找应该是比较好的算法

#11


向高手学习

#12


int[] original=new int[]{1,1,1,2,2,2,3,3,3};
Hashtable ht=new Hashtable();
for (int i=0;i<original.Length;i++)
{
if (ht[original[i].ToString()]==null)
ht[original[i].ToString()]=original[i];
}

&Ocirc;&Ugrave;±é&Agrave;úht&frac34;&Iacute;&sup3;&Eacute;&Aacute;&Euml;

#13


&Ocirc;&Ugrave;±é&Agrave;úht&frac34;&Iacute;&sup3;&Eacute;&Aacute;&Euml;
是这个玩意:
再遍历ht就成了

#14


也可以建一个临时表,先用SQL的distinct功能去掉相同的项目,返回的记录集放入数组内。