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

Ruby 如何在数组中查找重复元素并返回重复索引,ruby,arrays,Ruby,Arrays,我需要在数组中找到重复的纬度并稍微移动它,以避免标记显示问题 我在ruby中搜索并找到了一种方法: 1.在ruby中查找重复元素 我考虑排序数组元素并检查相邻元素 2.使用array.indexof获取其indexmay可以有3个或更多重复元素 这确实有效,但我觉得这不是最好的方法。有没有办法一次找到副本和副本索引 提前谢谢 编辑: 我找到了一个办法,当场检查副本和更改。 但问题是此函数将所有重复值更改为另一个重复值 我想这是因为主数组在检查和更改过程中没有更新,附加的是我的代码,无论如何要改进

我需要在数组中找到重复的纬度并稍微移动它,以避免标记显示问题

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

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

2.使用array.indexof获取其indexmay可以有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

如果性能对您来说不是一个真正的问题,那么查找重复并不困难。 最自然的方法是将每个元素与所有其他元素进行比较:

for (int i = 0; i < arraySize-1; ++i) {
    for (int j = i+1; j < arraySize; ++j) {
         if(array[i] == array[j]) changeDupe(array[j]);
    }
}
实现这一点的另一种方法是使用第二个数组。如果使用的是整数值,则可以如下所示:

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;
}
 Map<yourData, int> map;
 map<someValue, 1>;
 map[someValue] = 1; //work based on this return value;
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}
但是,如果其中一个元素大于数组的大小,则会出现边界问题。假设值为100,则尝试访问布尔数组的第100个元素

如果要使用第二种算法,但不使用整数数组,可以使用映射将数组中的每个值映射为int,然后使用映射值设置布尔值。 伪代码如下所示:

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;
}
 Map<yourData, int> map;
 map<someValue, 1>;
 map[someValue] = 1; //work based on this return value;
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}
Yeeet另一种方法是在对数组进行迭代之前对其进行排序,并在遇到不同的数字时停止。这将减少在数组上的迭代次数,但可能会在logn上增加排序算法的复杂性。 代码如下所示:

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;
}
 Map<yourData, int> map;
 map<someValue, 1>;
 map[someValue] = 1; //work based on this return value;
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,我会说是开的。 因为第二个是打开的,但有限制。
对于第三种,它将是循环排序+开启。

我认为没有一种不昂贵的方法可以做到这一点。如果你知道你只会有一个复制品,那么分类和检查就会起作用。如果有多个元素,则必须对照所有其他元素检查每个元素。这可以稍微优化一下。您可能需要运行一个复杂度接近On²的算法。但是,如果您可以使用辅助数组来存储您可以在上实现的值。这里的例子:谢谢你,兄弟。我很震惊,因为我刚刚学习了algo,有人在现实生活中提到了它:DI想强调的是,如果数组的元素大于数组的大小,那么大多数的On算法将无法工作,因为你将尝试访问第二个数组中不存在的位置。此外,它们只适用于整数,大多数情况下,你不需要重复元素的索引,当你检查并找到它时,只需在半天的尝试后轻轻移动它。我觉得必须使用On2 algo。谢谢
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]