如何在数组中查找重复元素并返回重复索引

时间:2014-09-17 03:41:15

标签: ruby arrays

我需要在数组中找到重复的纬度并稍微调整一下以避免标记显示问题。

我在ruby中搜索并找到了一种方法:

1.在ruby中找到重复的元素 (我考虑排序数组元素并检查相邻元素)

2.使用array.indexof()获取其索引(可能有3个或更多重复元素)

这确实有效,但我觉得这不是最好的方法。有没有办法一次性找到重复和重复索引?

提前致谢

修改 我找到了一种方法,检查重复并现场更改。 但问题是这个函数将所有重复值更改为另一个重复值。

我认为它是因为主数组在检查和更改过程中没有更新,附加的是我的代码,无论如何要改进它?

    @ln=0

     for @ln in 0..@checkLocation.length-1 do

     if (!(@checkLocation.index(@existlat)==nil) && (@existlat!=nil))   
     @checkLocation[@ln]=@checkLocation[@ln]+0.00001
     end
     @existlat=@checkLocation[@ln]
     end

2 个答案:

答案 0 :(得分:4)

a = [:a, :b, :c, :b, :d, :a, :e]
a.each_index.group_by{|i| a[i]}.values.select{|a| a.length > 1}.flatten
# => [0, 5, 1, 3]

答案 1 :(得分:2)

如果性能不是一个真正的问题,找到欺骗并不是很困难。 最自然的方法是将每个元素与所有其他元素进行比较:

for (int i = 0; i < arraySize-1; ++i) {
    for (int j = i+1; j < arraySize; ++j) {
         if(array[i] == array[j]) changeDupe(array[j]);
    }
}

上面的代码将允许您更改所有欺骗。 执行中的示例,changin dupes为0:

Input:  {1, 2, 3, 2, 1, 4, 5, 6, 8, 2}
Output: {1, 2, 3, 0, 0, 4, 5, 6, 8, 0}

实现此目的的另一种方法是使用第二个数组。如果您使用整数值,可以这样:

int input[10] = {1, 2, 3, 2, 1, 4, 5, 6, 8, 2};
bool output[10] = {false, false, false, false, false, false, false, false, false, false};

for (int i = 0; i < arraySize; ++i) {
     if (output[input[i]] == false) changeDupe(input[i]));
     else output[input[i]] = true;
}

但是,如果您的某个元素大于数组的大小,则会出现边界问题。假设您的值为100,那么您将尝试访问布尔数组的第100个元素。

如果要使用第二种算法但不使用整数数组,可以使用映射将数组上的每个值映射到int,然后使用map值设置布尔值。 伪代码看起来像这样:

 Map<yourData, int> map;
 map<someValue, 1>;
 map[someValue] = 1; //work based on this return value;

Yeeeet另一种方法是在迭代之前对数组进行排序,并在遇到不同的数字时停止。这会减少迭代数组的次数,但是你会添加排序算法的复杂性(可能是O(n log(n)))。 代码看起来像这样:

int i = 0;
while (i < arraySize-1) {

    if(array[i] == array[i+1])
        array[i] = 0;

    i++;
}

Input: {1, 1, 2, 3, 3, 4, 5, 6, 7, 8};
Output: {0, 1, 2, 0, 3, 4, 5, 6, 7, 8}

复杂性: 对于第一个算法,你会得到N *(N-1),我会说是O(n²)。 第二个是O(n),但限制适用。 对于第三个,它将是循环的排序+ O(n)。