http://q.hatena.ne.jp/1147338266

という質問があります。
これをJavaで行おうとした場合、どの様にコーディングすれば一番シンプルになりますでしょうか?ご教授願います。(後、VBAにMapコレクションみたいなのがあるかどうか教えて頂ければ嬉しいです。)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/05/17 01:28:04
  • 終了:2006/05/24 01:30:04

回答(2件)

id:kazu1107 No.1

mzk回答回数199ベストアンサー獲得回数142006/05/17 12:07:39

ポイント35pt

int num=10; // 要素の数

String[] str = new String[num]; // 文字列配列

int[] count = new int[num]; // 文字列毎のカウント

int i,j,k;

// ここで文字列配列「str」の代入処理をしたとする

// 検索処理

for(i=0;i<num;i++){</p>

  if(count[i] > 0){ continue; }

  for(j=i+1,k=0;j<num;j++){</p>

    if(str[i]== str[j]){

      count[j] = k;

      k++;

    }

  }

}

検索処理を終えたあとは以下のようなデータになるはずです。

例:「"aaaa","bbbb","aaaa","cccc","aaaa","bbbb"」がstr[]に代入されてる場合。

count[0] = 0

count[1] = 0

count[2] = 1

count[3] = 0

count[4] = 2

count[5] = 1

となるはずですので、あとは書式に従って処理してください。

ちなみにテストしてません。ご注意ください。

ダミーURL:http://q.hatena.ne.jp/1147338266

id:yoneyore

for文の方が早いですかね?

それはそうと、比較に==を使っている時点で読む気がしないのですが・・・。

Mapコレクション使っていった方が効率がよさそうな気がするのですが(逐次にサフィックスつける方が、for文で全て計算して再度つけるよりも)。

2006/05/17 23:35:26
id:miyamuko No.2

miyamuko回答回数29ベストアンサー獲得回数112006/05/17 20:06:31

ポイント35pt

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Map.html

こんな感じで Map を使って出現回数を数えるのがいいんじゃないでしょうか。

import java.util.*;
public class A {
    public static void main(String[] argv) {
        String[] range = {
            "てすと",
            "テスト",
            "てすすう",
            "テスト",
            "てすうう",
            "てすすう",
            "テスト",
            "てすとと",
            null, // ブランク
        };
        List<String> result = new ArrayList<String>();
        // 文字列の出現回数を保持する map
        Map<String, Integer> seen = new HashMap<String, Integer>();
        for (String s: range) {
            if (s == null) {
                // ブランクは無視
                continue;
            }
            if (seen.containsKey(s)) {
                // 2回目以降なら出現回数をインクリメントして _n を付加する
                int n = seen.get(s) + 1;
                seen.put(s, n);
                result.add(s + "_" + n);
            } else {
                // 初回なら出現回数に 1 を入れる。
                seen.put(s, 1);
                result.add(s);
            }
        }
        // 確認
        for (String s: result) {
            System.out.println(s);
        }
    }
}
id:yoneyore

拡張for文とかAutoboxing(でしたっけ?)書く人いるんですねぇ~。別件で衝撃です(JDK1.4までしか使ったことないので)。やっぱり僕が遅れているんですね。

やっぱりこうなりますかね。実はプロジェクトで帳票作成する際に、サフィックスつけないといけなくって昔こうやったの覚えていてて。これ以外になんかJavaのクラスで一発でできないのかなぁ~と思ったので。

ブランクのハンドリング方法が少し気になりましたが、今回はこの様な時の対処方法を知りたかったので、私が求めていた答えになっていると思います。丁重なご回答ありがとうございました。

引き続きこれよりシンプルに実装する方法あればご回答宜しくお願いします。

2006/05/17 23:54:54

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません