Найти самый большой символ, который произошел дважды в последовательности - PullRequest
0 голосов
/ 19 сентября 2019

мой метод findLargestDoubledChar принимает строку и возвращает char c, когда c - самый большой символ, который появляется рядом с его идентичным кодом.Например: findLargestDoubledChar(look) возвращает o и findLargestDoubledChar(aaxx) возвращает x.Когда нет двойников, он должен вернуть '\u0000' Я часами играл с этим кодом, и это то, что у меня есть.Куда я иду не так?

public static char findLargestDoubledChar(String string){

        char largestDoubleChar = '\u0000';
        String doubleChars = "";

        char[] stringArray = string.toCharArray();

        for(int x = 0; x < stringArray.length - 1; x++) {
            for (int j = x + 1; j < stringArray.length; j++) {
                if(stringArray[x] == stringArray[j]) {
                    System.out.println("Found Double!");
                } else {
                    continue;
                }
            }
        }

        for (int i = 0; i < doubleChars.length(); i++) { //find largest of doubleChars
            if (doubleChars.charAt(i) >= largestDoubleChar) {
                largestDoubleChar = doubleChars.charAt(i);
            } else {
                largestDoubleChar = '\u0000';
                continue;
            }
        }



        return largestDoubleChar;
    }

Ответы [ 4 ]

1 голос
/ 19 сентября 2019

Похоже, вы перебираете doubleChars во втором цикле, когда для него задана пустая строка.Может быть, что-то вроде этого будет работать лучше:

public static char findLargestDoubledChar(String string){

    char largestDoubleChar = '\u0000';
    String doubleChars = "";

    char[] stringArray = string.toCharArray();

    for(int i = 0; i < stringArray.length - 1; i++) {
        if (stringArray[i] == stringArray[i + 1]) {
            System.out.println("Found Double!");
            if (stringArray[i] > largestDoubleChar) largestDoubleChar = stringArray[i];
        }
    }

    return largestDoubleChar;
}
0 голосов
/ 19 сентября 2019

Попробуйте это.

static final Pattern DOUBLE_PAT = Pattern.compile("(.)\\1");

public static char findLargestDoubledChar(String string){
    return DOUBLE_PAT.matcher(string).results()
        .map(x -> x.group().charAt(0))
        .max(Comparator.naturalOrder()).orElse('\u0000');
}
0 голосов
/ 19 сентября 2019

Это можно сделать с помощью одного оператора, подобного этому, который также поддерживает символы Юникода с дополнительных плоскостей, таких как эмодзи.

public static String findLargestDoubledChar(String input) {
    return Character.toString(Pattern.compile("(.)\\1").matcher(input)
            .results().mapToInt(r -> r.group(1).codePointAt(0)).max().orElse('\0'));
}

Тест

System.out.println(findLargestDoubledChar("look"));
System.out.println(findLargestDoubledChar("aaxx"));
System.out.println(findLargestDoubledChar("???????"));

Выход

o
x
?
0 голосов
/ 19 сентября 2019

У вас есть несколько проблем.

  1. Внутренний цикл не нужен для первого цикла.
  2. Вы не сохраняете удвоенный символ, когда находитеЭто.Пример ответа от вашего:

    'public static char findLargestDoubledChar (String string) {

    char largestDoubleChar = '\u0000';
    String doubleChars = "";
    
    char[] stringArray = string.toCharArray();
    
    for(int x = 0; x < stringArray.length - 1; x++) {
        if (stringArray[x]==stringArray[x+1]){
            System.out.println("Found Double");
            doubleChars= doubleChars+ stringArray[x];
    
        }
    }
    
    for (int i = 0; i < doubleChars.length(); i++) { //find largest of doubleChars
        if (doubleChars.charAt(i) >= largestDoubleChar) {
            largestDoubleChar = doubleChars.charAt(i);
        } else {
            largestDoubleChar = '\u0000';
            continue;
        }
    }
    
    
    
    return largestDoubleChar;
    

    }'

...