4

手にジレンマがあります。多くの試行錯誤の末、私はまだこの単純な作業を理解できませんでした.

私は1つの配列を持っています

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. 2 つの for ループを使用します。1 つは配列をループして値を取得するループで、もう 1 つは (現在のインデックスから) 配列を調べてその値を探す内側のループです。
  2. 単語を含むマップを作成し、配列をループして、配列から現​​在フェッチされている値に対応する出現回数をマップに入力します。

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) 。System.out.print()等しい場合は a を実行し、等しくない場合は 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、最初の値から始めて最後まで同じものを見つけるだけです.1行で印刷を見つけて新しい行に移動した場合は、印刷されたすべての値を削除する必要があります。

Complexity nlogn + n== nlognmergeまたはquick並べ替え、この後、最後に移動してシーケンス値を呼び出します。もっと解決策がありますが、それで十分だと思います。

于 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 に答える