合并数组中相同的值

5
public static String[][][] cleanUp(String[][][] array) {
    for (int f = 0; f < array.length; f++) {
        for (int g = 0; g < array[f].length; g++) {
            int position = 0;
            //boolean flag = false;
            int count = 0;
            for (int h = 0; h < array[f][g].length; h++) {
                if (array[f][g][h].equals(array[f][g][h+1])) count++;
                else {
                    ArrayList<String> temp = new ArrayList<String>(Arrays.asList(array[f][g]));
                    for (int i = count - 1; i > position; i--) {
                        temp.remove(i);
                        position = i-1 ;
                    }
                    temp.set(position, array[f][g][h] + " (" + count + ")");
                }
            }
        }
    }
    return array;
}

本质上,我想做的是获取一个由字符串组成的三维数组,并让其中的每个一维数组显示重复值的数量。比如,如果我有一个如下所示的字符串数组:

[go, go, go, go, go, go]
[go, stop, stop, stop]

它将变成:

[go (5)]
[go (1), stop (3)]

我该怎么做,我做错了什么?

6
你可以通过正确比较字符串(使用equals而不是==)来开始。 - Eran
1
据我所知,数组的两个外部维度与去重无关。如果是这样的话,可能更容易考虑如何对 String[] 进行操作,然后只需在两个循环中包装对该方法的调用以迭代外部维度。 - Andy Turner
@Eran 哎呀,我修复了,但还是不起作用。无论如何,我都会得到一个ArrayIndexOutOfBoundsException错误。 - Calvin Kinzie
我不明白为什么你需要一个三维数组!你能解释一下吗? - Bhoot
我不这样做。这是因为我在代码的另一个部分中使用了3D数组,保持原样更加简单。Pham Trung下面的解决方案对于1D数组非常理想。 - Calvin Kinzie
1个回答

5

您需要修改最后一个内部循环:

        int count = 0;
        for (int h = 0; h < array[f][g].length; h++) {
            if (array[f][g][h].equals(array[f][g][h+1])) count++;
            //You dont check for out of bound here, so `h + 1` will cause out of bound error
            else {
                ArrayList<String> temp = new ArrayList<String>(Arrays.asList(array[f][g]));
                for (int i = count - 1; i > position; i--) {
                    temp.remove(i);
                    position = i-1 ;
                }
                temp.set(position, array[f][g][h] + " (" + count + ")");
            }
            //Count is not reset after this, so this will be wrong!
        }

我会这么做:

如何实现:

        ArrayList<String> tmp  = new ArrayList<>();
        for (int h = 0; h < array[f][g].length; h++) {
            int count = 1;
            while(h + count < array[f][g].length && array[f][g][h].equals(array[f][g][h+count])) 
               count++;
            tmp.add(array[f][g][h] + "(" + count + ")");
            h += count - 1;//Update h to skip identical element
        }

ArrayList tmp将保存array[f][g]的结果,您应该注意我如何更新h以跳过所有相同的元素。

更新:测试结果


@CalvinKinzie 不好意思,我无法查看链接(这是我的网络问题),但是我已经测试过我的代码了,结果在这里。所以我认为对于三维或更高维数组来说,使用它非常简单,你不需要再使用“position” :) - Pham Trung
啊,谢谢。我也意识到我的错误是在你的代码中从未放置array[f][g] = tmp.toArray(new String[tmp.size()]);在闭合括号之后(我建议添加它)。现在一切都好了。 - Calvin Kinzie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接