《编程珠玑》第二章问题C:找出相同的英文单词(单词改变顺序可以互相转化即为相同)

public class FindSameWord {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String filename = "doc//obama.txt";
        FindSameWord fs = new FindSameWord();
        String txt = fs.getTXT(filename);
        ArrayList arrayList = new ArrayList();
        HashMap fingerPrint = new HashMap();

        StringTokenizer st = new StringTokenizer(txt, ", ! ' . ��");// 按逗号/空格/叹号分割,其他字符自行添加

        while (st.hasMoreElements()) {
            String tmp = (String) st.nextElement();
            if (tmp != "" && tmp != null && tmp != "s" && !arrayList.contains(tmp.toLowerCase()))
                arrayList.add(tmp.toLowerCase());
        }

        System.out.println(arrayList.size());
        fs.sortList(arrayList);
        for (int i = 0; i < arrayList.size(); i++) {
//          System.out.println(i + "," + arrayList.get(i) + ":");
            if (!fingerPrint.containsKey(fs.makeFinger(arrayList.get(i))))
                fingerPrint.put(fs.makeFinger(arrayList.get(i)), arrayList.get(i));
            else
                fingerPrint.put(fs.makeFinger(arrayList.get(i)),
                        fingerPrint.get(fs.makeFinger(arrayList.get(i))) + "," + arrayList.get(i));
        }

        for (Map.Entry entry : fingerPrint.entrySet()) {
//          System.out.println(entry.getKey() + "--->" + entry.getValue());
            if (entry.getValue().contains(","))
                System.out.println(entry.getKey() + "--->" + entry.getValue());
        }

//      System.out.println(fs.stringSort("alive"));
//      System.out.println(fs.makeFinger("aliive"));
    }

    String getTXT(String filename) {
        String txt = "";
        try {
            File file = new File(filename);
            BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
            String s = null;
            while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
                txt = txt + s;
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return txt;
    }

    ArrayList sortList(ArrayList al) {
        for (int i = 0; i < al.size(); i++) {
            for (int j = i + 1; j < al.size(); j++) {
                if (!stringCompare(al.get(i), al.get(j))) {
                    String tmp = al.get(i);
                    al.set(i, al.get(j));
                    al.set(j, tmp);
                }

            }
        }
        return al;
    }

    boolean stringCompare(String a, String b) {
        int aLength = a.length();
        int bLength = b.length();
        int length = 0;
        if (aLength > bLength)
            length = bLength;
        else
            length = aLength;
        for (int i = 0; i < length; i++) {
            if (a.charAt(i) < b.charAt(i))
                return true;
            if (a.charAt(i) > b.charAt(i))
                return false;
        }

        if (aLength > bLength)
            return false;
        else
            return true;
    }

    String makeFinger(String s) {
        if (s.length() == 1)
            return s;

        String fingerPrint = "";

        String print = stringSort(s);

//      System.out.println("print"+print);

        char now = print.charAt(0);
        int count = 1;

        for (int i = 1; i < print.length(); i++) {
            if (print.charAt(i) == now) {
                count++;
                if (i == print.length() - 1)
                    fingerPrint = fingerPrint + String.valueOf(now) + String.valueOf(count);
            } else {
                if (count == 1)
                    fingerPrint = fingerPrint + String.valueOf(now);
                else
                    fingerPrint = fingerPrint + String.valueOf(now) + String.valueOf(count);
                count = 1;
                now = print.charAt(i);
                if (i == print.length() - 1)
                    fingerPrint = fingerPrint + String.valueOf(now);
            }
        }
//      System.out.println(fingerPrint);
        return fingerPrint;
    }

    String stringSort(String s) {
        String after = "";

        char[] tmp = s.toCharArray();

        for (int i = 0; i < tmp.length; i++) {
            for (int j = i + 1; j < tmp.length; j++) {
                if (tmp[i] > tmp[j]) {
                    char hou = tmp[j];
                    tmp[j] = tmp[i];
                    tmp[i] = hou;
                }
            }
        }
        after = String.valueOf(tmp);

//      System.out.println(after);
        return after;
    }
}

你可能感兴趣的:(算法)