4

我手上有一个难题。经过多次试验和错误,我仍然无法弄清楚这个简单的任务。

我有一个数组

String [] array = {anps, anps, anps, bbo, ehllo};

我需要能够遍历数组并找到重复项并将它们打印在同一行上。没有重复的单词应该单独显示

输出需要是这样的

anps anps anps
bbo
ehllo

我试过while,for循环,但逻辑似乎是不可能的。

4

7 回答 7

10

HashMap好的,HashSet对于这个非常简单的迭代问题,错误答案或答案的数量令人担忧,因此这是一个正确的解决方案。

Arrays.sort(array);

for (int i = 0; i < array.length; ++i){
    if (i+1 == array.length) {
        System.out.println(array[i]);
    } else if (array[i].equals(array[i+1])) {
        System.out.print(array[i]+" ");
    } else {
        System.out.println(array[i]);
    }
}
于 2012-06-14T20:11:24.387 回答
2

有多种方法可以实现这一目标。

  1. 使用两个 for 循环,一个循环遍历数组并选择一个值,另一个内部循环通过数组(从当前索引)查找该值
  2. 您可以有一个包含单词的地图,循环遍历数组,并使用与当前从数组中获取的值相对应的出现次数填写地图

第二种方式更好。代码类似于:

Map<String, Integer> occurences = new HashMap<String, Integer>();
for(int index=0; index < array.length; index++){
       int nOcc = 1;
       if(occurences.containsKey(array[index]){
         nOcc = occurences.get(array[index]) + 1;
       }
       occurences.remove(array[index]);
       occurences.put(array[index], nOcc);
}

此时,地图应包含所有单词(键)及其对应的出现次数(值)

于 2012-06-14T19:57:50.310 回答
2

先对数组排序,然后

for(int i = 0, i < array.length; i++){
    String temp = array[i];
    System.out.print(temp+" ");
    for(int j = i+1; j < array.length; j++){
        String temp2 = array[j];
        if(temp.compareTo(temp2) == 0){
            System.out.print(temp2+" ");
            i++;
        }
    }
    System.out.println();
}

或类似的东西...

于 2012-06-14T20:02:18.143 回答
1

如果先对数组进行排序,则只需检查当前索引是否等于下一个索引(请记住,您必须考虑IndexOutOfBounds),如果它们相等,则执行 a,System.out.print()如果不相等,则执行 a System.Out.println()

String [] array = {"anps", "anps", "anps", "bbo", "ehllo"};
// If you already are assured that the strings in the array are sorted
// then the sort is not necessary. 
Arrays.sort(array);
for(int i = 0; i < array.length; i++){
    if((i+1)==array.length || !array[i].equals(array[(i+1)])){
        System.out.println(array[i]);
    } else {
        System.out.print(array[i]+" ");
    }
}
于 2012-06-14T19:56:47.507 回答
0

复杂性n^2,从第一个值开始到最后找到相同的值,如果你在一行中找到打印并转到新行,你也应该删除所有打印的值。

复杂性nlogn + n==或排序nlogn,然后转到末尾并 pring 序列值。还有更多解决方案,但我认为对您来说已经足够了。mergequick

于 2012-06-14T19:59:47.520 回答
0

朴素算法

  • 创建地图
  • 遍历所有数组
  • 检查地图中是否已存在密钥
  • 如果是,则更新值 +1
  • 如果没有插入
  • 根据需要打印地图

你应该能够做你正在寻找的!

于 2012-06-14T20:03:58.143 回答
0

使用以下逻辑

import java.util.ArrayList;


public class RepeatStringPrint {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            String[] x = { "anps", "anps", "anps", "bbo", "ehllo" };
            String total[] = new String[50];
            String sTotal[] = null;
            for (int i = 0; i < x.length; i++) {
                total[i] = x[i];
            }
            for (int k = 0; k < total.length; k++) {
                int count = 0;
                if (total[k] != null) {
                    sTotal = new String[50];
                    for (int i = 0; i < total.length; i++) {
                        if (total[k] == total[i]) {
                            count++;
                            if (count <= 1) {
                                sTotal[i] = total[k];
                            }
                        }
                    }
                    if (sTotal[k] != null) {
                        for(int j=0; j<count; j++){
                            System.out.print(sTotal[k]+"\t");
                        }
                        System.out.print("\n");
                    }
                }

            }
        }
        catch (Exception e) {

        }
    }

}
于 2014-07-12T17:19:38.053 回答