Java で Suffix Array

なんか JavaSuffix Array なコードというリクエストがあったので簡単に。
とりあえず Suffix Array の構築だけ。効率とか一切無視で。

import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SuffixArrayBuilder {
    public void build(String text, Integer[] sa) {
        Arrays.sort(sa, new SuffixComparator(text));
    }

    private static class SuffixComparator implements Comparator<Integer> {
        private String text;

        public SuffixComparator(String text) {
            this.text = text;
        }

        @Override
        public int compare(Integer a, Integer b) {
            return text.substring(a).compareTo(text.substring(b));
        }
    }

    public static void main(String[] args) throws IOException {
        String text = "Hi Ho Hi Ho\nHi Ho\nHi";
        Integer[] sa = new Integer[text.length()];
        for (int i = 0; i < sa.length; i++) {
            sa[i] = i;
        }

        new SuffixArrayBuilder().build(text, sa);

        Pattern pat = Pattern.compile(".{0,10}");
        for (int i = 0; i < sa.length; i++) {
            Matcher m = pat.matcher(text.substring(sa[i]));
            if (m.lookingAt()) {
                System.out.printf("%3d %3d %s", i, sa[i], m.group());
                System.out.println();
            }
        }
    }
}