Intereting Posts
Обнаружение приложения Android на фоне Кодирование и мультиплексирование видео с использованием MediaCodec и MediaMuxer Есть ли более быстрый способ перебора строк из запроса Sqlite? Частичный экран WebView с <видео> срезанным наполовину Как понять чистую архитектуру VIPER? Как исправить Android Studio, застряв в выполнении задач Gradle? Блокировать / отключить панель состояния в Android-планшете / мобильном телефоне OnUpgrade () база данных sqlite в Android Как я могу просмотреть все исходное дерево с помощью обработчика аннотаций? Android, приостанавливая и возобновляя обратные вызовы обработчиков Ошибка Android: не удалось установить * .apk на устройстве *: таймаут Фрагмент в ViewPager возвращает пустой объект onResume Android: После создания источника платформы, как подписать произвольный APK с ключом платформы? Как создать ярлык приложения внутри пользовательского запуска в Android? Энергопотребление компонентов смартфона

Рекурсивный метод работает в java с консолью, но не с android

Я написал рекурсивный метод, который получает все возможные комбинации символов от символов в строке. У меня также есть способ доступа к нему и возврата списка комбо:

public static void uns(String word, StringBuilder s, List combos) { for(char c: word.toCharArray()) { s.append(c); if(word.length() != 1) { uns(removeChar(word, c),s,combos); } else { combos.add(s.toString()); } s.deleteCharAt(s.toString().length()-1); } } public static List getCombinations(String word) { List<String> combinations = new ArrayList<String>(); uns(word,new StringBuilder(),combinations); return combinations; } public static String removeChar(String s, char c) { int index = s.indexOf(c); return s.substring(0,index)+s.substring(index+1); } 

При тестировании на Java он работал без каких-либо недостатков. По какой-то причине, когда я использую его в Android, список заполняется правильным количеством элементов, но каждый элемент один и тот же. Например, для слова «здесь» он возвращает список, заполненный «eerh».

Solutions Collecting From Web of "Рекурсивный метод работает в java с консолью, но не с android"

Это очень странный сбой (определенно воспроизводимый), и вы можете записать отчет об ошибке.

Однако это временное решение; Вместо использования .toString() , который каким-то образом повторно использует ссылку (даже если я делаю с ней .substring(0) ), поэтому все они обновляются; Если вы распечатаете список после каждой итерации, вы увидите, что я имею в виду.

Вот мое хакерское / неэффективное решение. Изменить:

 combos.add(s.toString()); 

… для:

 combos.add(s + ""); 

Это эффективно корректно клонирует строку в массив, так что они не обрабатываются:

02-17 19:33:48.605: I/System.out(6502): [Combos]: [here, heer, hree, hree, here, heer, ehre, eher, erhe, ereh, eehr, eerh, rhee, rhee, rehe, reeh, rehe, reeh, ehre, eher, erhe, ereh, eehr, eerh]

Я не уверен, но я думаю, что метод valueOf () из класса строк также будет работать. Возможно, попробуйте использовать List вместо StringBuilder, добавьте символы в список и попробуйте String.valueOf (s.get (i)); И это должно преобразовать символ в строку. Я не понимаю, почему выход не будет работать на Android, но вам может понадобиться немного изменить свой цикл. надеюсь, это поможет.