Упорядочив строку в алфавитном порядке - я что-то упустил очевидное? - PullRequest
4 голосов
/ 21 ноября 2011
public class Anagram {
    public static void main(String[] args) {

        String a = "Despera tion-".toLowerCase();
        String b = "A Rope Ends It".toLowerCase();

        String aSorted = sortStringAlphabetically(a);
        String bSorted = sortStringAlphabetically(b);

        if(aSorted.equals(bSorted)){
            System.out.println("Anagram Found!");
        }else{
            System.out.println("No anagram was found");
        }

    }

    public static String sortStringAlphabetically(String s) {

        char[] ca = s.toCharArray();
        int cnt = 0;
        ArrayList al = new ArrayList();

        for (int i = 0; i < ca.length; i++) {
            if (Character.isLetter(ca[cnt])) 
                al.add(ca[cnt]);

            cnt++;
        }

        Collections.sort(al);
        return al.toString();
    }
}

Как ученик, я взломал этот логический тестер анаграммы.Мое выбранное решение состояло в том, чтобы создать метод sortStringAlphabetically, кажется, делает слишком много жонглирования типа String -> chars [] -> ArrayList -> String - учитывая, что я просто хочу сравнить 2 строки, чтобы проверить, является ли одна фраза анаграммойдругой - мог бы я сделать это с меньшим количеством жонглирования шрифтами?

ps Решение для репетиторов находилось в миле от моей попытки, и, вероятно, намного лучше по многим причинам - но я действительно пытаюсь справиться с этим.на все различные типы коллекций.

http://www.home.hs -karlsruhe.de / ~ pach0003 / informatik_1 / aufgaben / en / doc / src-html / de / hska / java / упражнения / массивы / Anagram.html # line.18

EDIT

FTW - вот оригинальная задача, я понимаю, что отошел от решения.

http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/en/arrays.html

Моей начальной реакцией на колено было просто сработать через массив a, выбив те символы, которые совпадают с массивом b - но этоказалось, потребовал от менясоздавайте массив на каждой итерации - большое спасибо за все ваши усилия по обучению меня.

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

Существуют различные способы улучшить это, если вы используете этот алгоритм. Во-первых, вам не обязательно создавать массив символов. Вы можете использовать String.charAt () для доступа к определенному символу вашей строки.

Во-вторых, вам не нужен список. Если вы использовали SortedMultiSet или SortedBag, вы можете просто добавить вещи в отсортированном порядке. Если вы напишите функцию, которая создает SortedMultiSet из вашей строки, вы можете просто сравнить наборы, не перестраивая строку.

Примечание: я не знаю, какие библиотеки вам разрешено использовать (у Google и Apache есть эти типы), но вы всегда можете «варить свои собственные».

Кроме того, убедитесь, что вы используете дженерики для ваших типов. ИМХО, просто определять ArrayLists довольно рискованно.

1 голос
/ 21 ноября 2011
public class Anagram {
    public static void main(String[] args) throws Exception {
        String s1 = "Despera tion-";
        String s2 = "A Rope Ends It";
        anagramCheck(s1, s2);
    }

    private static void anagramCheck(String s1, String s2) {
        if (isAnagram(s1, s2)) {
            System.out.println("Anagram Found!");
        } else {
            System.out.println("No anagram was found");
        }
    }

    private static boolean isAnagram(String s1, String s2) {
        return sort(s1).equals(sort(s2));
    }

    private static String sort(String s) {
        char[] array = s.replaceAll("\\W", "").toLowerCase().toCharArray();
        Arrays.sort(array);
        return new String(array);
    }
}
1 голос
/ 21 ноября 2011

Вы можете просто отсортировать строку без использования списка:

public static String sortStringAlphabetically(String s) {
    String lettersOnly = s.replaceAll("\\W", "");
    char[] chars = lettersOnly.toCharArray();
    Arrays.sort(chars);
    return new String(chars);
}

Примечание: я на самом деле не пробовал запускать код.

1 голос
/ 21 ноября 2011

Ваш алгоритм, но короче (и все же, медленнее).«Жонглирование типов» выполняется «неявно» в различных классах библиотеки Java:

public static boolean isAnagram(String a, String b) {
    List<String> listA = new ArrayList<String>(Arrays.asList(
      a.toLowerCase().replaceAll("\\W", "").split("")));
    List<String> listB = new ArrayList<String>(Arrays.asList(
      b.toLowerCase().replaceAll("\\W", "").split("")));

    Collections.sort(listA);
    Collections.sort(listB);

    return listA.equals(listB);
}

При необходимости замените регулярное выражение \W, чтобы исключить те буквы, которые вы не хотите рассматривать для анаграммы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...