Hatena::Grouptopcoder

hama_DU@TopCoderへの道

2012-04-02SRM353, SRM354 (Practice)

SRM 353 Glossary

|  SRM 353 Glossary - hama_DU@TopCoderへの道 を含むブックマーク はてなブックマーク -  SRM 353 Glossary - hama_DU@TopCoderへの道

http://www.topcoder.com/stat?c=problem_statement&pm=7838

  • 問題文の通りに正しく実装する。
    • 文字列の比較はcase insensitiveなのに注意(サンプルにあって助かった)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Glossary {

	public String[] buildGlossary(String[] items) {
		List<String>[] list = new List[256];
		for (int i = 0 ; i < 256 ; i++) {
			list[i] = new ArrayList<String>();
		}
		int len = items.length;
		for (int i = 0 ; i < len ; i++) {
			String a = items[i];
			char c = a.charAt(0);
			if ('a' <= c && c <= 'z') {
				c = (char)('A' + (c - 'a'));
			}
			list[c].add(a);
		}
		for (int i = 'A' ; i <= 'Z' ; i++) {
			Collections.sort(list[i], new Comparator<String>(){
				public int compare(String a, String b) {
					return a.compareToIgnoreCase(b);
				}
			});
		}
		
		
		List<String> left = new ArrayList<String>();
		List<String> right = new ArrayList<String>();
		
		for (int i = 'A' ; i <= 'M' ; i++) {
			if (list[i].size() >= 1) {
				left.add((char)i + "                  ");
				left.add("-------------------");
				for (String l : list[i]) {
					int sz = l.length();
					String add = "  " + l;
					for (int j = sz ; j < 17 ; j++) {
						add += ' ';
					}
					left.add(add);
				}
			}
		}
		for (int i = 'N' ; i <= 'Z' ; i++) {
			if (list[i].size() >= 1) {
				right.add((char)i + "                  ");
				right.add("-------------------");
				for (String l : list[i]) {
					int sz = l.length();
					String add = "  " + l;
					for (int j = sz ; j < 17 ; j++) {
						add += ' ';
					}
					right.add(add);
				}
			}
		}		
		
		
		int size = Math.max(left.size(), right.size());
		if (left.size() < size) {
			for (int i = left.size() ; i < size ; i++) {
				left.add("                   ");
			}
		}
		if (right.size() < size) {
			for (int i = right.size() ; i < size ; i++) {
				right.add("                   ");
			}
		}
		
		String[] ret = new String[size];
		for (int i = 0 ; i < size ; i++) {
			ret[i] = left.get(i) + "  " + right.get(i);
		}
		return ret;
	}
}