【Java】アナグラムの生成ロジック


アナグラムを生成するプログラム。
暇だから作った。
もうすこしスマートなやり方あるんでしょうけども。
個人的な使い方が「ベーシック認証のIDとパスワードの生成」なので
短いながらも予想しづらいランダム風な文字列が作れればなんでもよく、
たまに活用しています。


 


 
以下の通りである↓

import java.util.*;  

public class AnagramMake {

public static void main(String[] args) {  
  
	try {  
		String anagramStr = makeAnagram(args);  
		  
		System.out.println("オリジナル文字列:" + args[0]);  
		System.out.println("アナグラム文字列:" + anagramStr);  
		  
		  
	} catch(Throwable e) {  
		e.printStackTrace();  
	}  
  
}  
  
  
  
public static String makeAnagram(String[] args) throws Throwable {  
  
	if (args == null) {  
		throw new Exception("Argument is null");  
	}  
	if (args.length == 0) {  
		throw new Exception("Argument is length 0");  
	}  
	String arg = args[0];  
	if (arg.trim().length() == 0) {  
		throw new Exception("Argument is empty");  
	}  
	  
	List<String> originalStr = new ArrayList<String>();  
	for (int i=0; i < arg.length(); i++) {  
	  
		originalStr.add(arg.substring(i,i+1));  
		  
	}  
	  
	List<String> anagramStr = new ArrayList<String>();  
	for (int i=0; i < arg.length(); i++) {  
	  
		int idx = (int)(Math.random() * originalStr.size());  
		  
		String str = originalStr.get(idx);  
		char chr = str.charAt(0);  
		<span style="color: green;">// 半角ascii文字なら50%の確率で大文字小文字変換</span>  
		if (chr &gt;= 'A' &amp;&amp; chr &lt;= 'z'){  
			int toUpper = (int)(Math.random() * 10);  
			if (toUpper &gt;= 5) {  
			  
				str = str.toUpperCase();  
		  
			} else {  
			  
				str = str.toLowerCase();  
				  
			}  
		}  
		anagramStr.add(str);  
		originalStr.remove(idx);  
		  
	}  
	  
	StringBuilder sb = new StringBuilder();  
	for (int i=0; i &lt; anagramStr.size(); i++) {  
		sb.append(anagramStr.get(i));  
	}  
	  
	return sb.toString();  
  
}  

}

 

  • 引数で渡された文字列を、1文字ずつjava.util.Listにaddして、
    乱数を使って要素を取り出しつつ、同じ要素数のListに移し替える。基本、そんだけ。
  • 移し替える途中、半角ascii(いわゆるアルファベット)だったら、50%の確率で大文字小文字変換する。
    これは、元文字を推測しづらくするための完全な個人的趣味措置である。


冒頭書いた通り、個人的な用途が「ベーシック認証のIDとパスワードに使用する文字列の生成」なので、
基本的に0~9とa~zとA~Zしか入力される想定がない。
といいつつ、1文字ずつ取り出して入れ替えてるだけなので、
「あ」とか「A」(全角アルファベット)とか「ア」(半角カタカナ)とか「亜」(漢字)も別に問題なく扱える。
ただ、String#charAtを使っている以上、サロゲートペアはおかしなことになるので未対応である。