Javaでシーケンス内の2番目に多く繰り返される単語を検索する方法
Javaで文字列のシーケンス(リスト)の中から、2番目に多く繰り返される単語を検索する方法を解説します。以下のコードでは、HashMapを使って各単語の出現回数をカウントし、その中から出現頻度が2番目に高い単語を特定しています。
サンプルコード
import java.util.*;
public class Demo{
static String second_repeated(Vector<String> my_seq){
HashMap <String, Integer> my_map = new HashMap<String,Integer>(my_seq.size()){
@Override
public Integer get(Object key){
return containsKey(key) ? super.get(key) : 0;
}
};
for (int i = 0; i < my_seq.size(); i++)
my_map.put(my_seq.get(i), my_map.get(my_seq.get(i))+1);
int first_val = Integer.MIN_VALUE;
int sec_val = Integer.MIN_VALUE;
Iterator<Map.Entry<String, Integer>> my_iter = my_map.entrySet().iterator();
while (my_iter.hasNext()){
Map.Entry<String, Integer> ent = my_iter.next();
int v = ent.getValue();
if( v > first_val){
sec_val = first_val;
first_val = v;
}
else if (v > sec_val && v != first_val)
sec_val = v;
}
my_iter = my_map.entrySet().iterator();
while (my_iter.hasNext()){
Map.Entry<String, Integer> ent = my_iter.next();
int v = ent.getValue();
if (v == sec_val)
return ent.getKey();
}
return null;
}
public static void main(String[] args){
String arr[] = {"This", "sample", "only", "anything", "sample", "from", "sample","only"};
List<String> my_seq = Arrays.asList(arr);
System.out.println("シーケンス内で2番目に多く繰り返される単語は次のとおりです:");
System.out.println(second_repeated(new Vector<>(my_seq)));
}
}
実行結果
シーケンス内で2番目に多く繰り返される単語は次のとおりです : only
コードの解説
Demo クラスには second_repeated メソッドが定義されています。このメソッドはまずハッシュマップを作成し、get メソッドをオーバーライドしています。これにより、マップに存在しないキーが指定された場合でも null ではなく 0 を返すようになり、出現回数のカウント処理を簡潔かつ安全に記述できます。
続いて、forループでシーケンス内の各単語をマップに登録しながら出現回数を加算していきます。その後、イテレータを作成し、hasNext メソッドを使ってマップの全エントリを順番に走査します。
最初の走査では、各単語の出現回数を比較しながら、最も多く繰り返された単語の出現回数(first_val)と、2番目に多い出現回数(sec_val)を求めます。2回目の走査では、sec_val と同じ出現回数を持つエントリを見つけ、そのキー(単語)を返します。
main メソッドでは文字列配列を定義し、Arrays.asList でリストに変換した後、Vector として second_repeated メソッドに渡しています。最終的な結果がコンソールに出力されます。
補足ポイント
このアルゴリズムの時間計算量は O(n) で、要素数に対して線形に動作するため効率的です。なお、Vector はレガシーなクラスのため、新規開発では ArrayList を使うのが一般的です。また、大文字・小文字は区別されるため、必要に応じて事前に toLowerCase() などで正規化しておくとよいでしょう。
-
Javaで台形の面積を求めるプログラムの作成方法を解説
この記事では、Javaを使って台形(トラペジウム)の面積を求める方法について詳しく解説します。台形とは、少なくとも1組の対辺が互いに平行になっている四角形のことです。平行な2つの辺は「底辺」と呼ばれ、平行でない残りの2つの辺は「脚」と呼ばれます。英語圏では trapezoid(トラペゾイド)と呼ばれることもあります。 台形の面積は、次の公式を使って計算できます。 面積 = (高さ ÷ 2) × (上底 + 下底) すなわち、 面積 = ½ × (平行な2辺の長さの合計) × (平行な2辺間の垂直距離) 以下に具体的なイメージを示します。平行な2辺の長さを a、b、台形の高さを h としたとき
-
【Java入門】長方形の周囲(外周)を求めるプログラムの作り方
長方形の周囲とは? この記事では、Javaを使って長方形の周囲(外周)を求める方法を解説します。長方形の周囲とは、長方形の4つの辺すべての長さを足し合わせた合計のことで、次の図のように「縦の辺2本」と「横の辺2本」の長さを合計したものに相当します。 長方形は向かい合う辺の長さが等しいという性質を持つため、周囲は次の式で計算できます。 周囲 = 2 ×(縦の長さ + 横の長さ) 入力と出力の例 たとえば、入力が次の値であるとします。 長方形の各辺の長さ:5, 8, 5, 8 このとき、期待される出力は次のとおりです。 Perimeter : 26 アルゴリズム 処理の流れは以下のようになりま