Как перемешать символы в строке

Как перетасовать символы в строке (например, hello может быть ehlol или lleoh или …). Я не хочу использовать метод Collections.shuffle(...) , есть ли что-нибудь более простое?

Я не знаю ничего проще. Но вы можете использовать функцию Math.rand () для генерации случайного числа в диапазоне длины символа без замены, и это даст вам перетасованный вывод

 public class Shuffle { public static void main(String[] args) { Shuffle s = new Shuffle(); s.shuffle("hello"); } public void shuffle(String input){ List characters = new ArrayList(); for(char c:input.toCharArray()){ characters.add(c); } StringBuilder output = new StringBuilder(input.length()); while(characters.size()!=0){ int randPicker = (int)(Math.random()*characters.size()); output.append(characters.remove(randPicker)); } System.out.println(output.toString()); } } /* Sample outputs hlleo llheo leohl lleho */ в public class Shuffle { public static void main(String[] args) { Shuffle s = new Shuffle(); s.shuffle("hello"); } public void shuffle(String input){ List characters = new ArrayList(); for(char c:input.toCharArray()){ characters.add(c); } StringBuilder output = new StringBuilder(input.length()); while(characters.size()!=0){ int randPicker = (int)(Math.random()*characters.size()); output.append(characters.remove(randPicker)); } System.out.println(output.toString()); } } /* Sample outputs hlleo llheo leohl lleho */ 

Не большая производительность, но вполне читаемая, на мой взгляд:

 public static String shuffleString(String string) { List letters = Arrays.asList(string.split("")); Collections.shuffle(letters); String shuffled = ""; for (String letter : letters) { shuffled += letter; } return shuffled; } 

Как насчет этого:

 public static String shuffle(String text) { char[] characters = text.toCharArray(); for (int i = 0; i < characters.length; i++) { int randomIndex = (int)(Math.random() * characters.length); char temp = characters[i]; characters[i] = characters[randomIndex]; characters[randomIndex] = temp; } return new String(characters); } 
 class ShuffleString { public static String shuffle(String s) { String shuffledString = ""; while (s.length() != 0) { int index = (int) Math.floor(Math.random() * s.length()); char c = s.charAt(index); s = s.substring(0,index)+s.substring(index+1); shuffledString += c; } return shuffledString; } } public class foo{ static public void main(String[] args) { String test = "hallo"; test = ShuffleString.shuffle(test); System.out.println(test); } } 

Выход: ahlol

Например:

 static String shuffle(String text){ if (text.length()<=1) return text; int split=text.length()/2; String temp1=shuffle(text.substring(0,split)); String temp2=shuffle(text.substring(split)); if (Math.random() > 0.5) return temp1 + temp2; else return temp2 + temp1; } 

Не знаете, почему вы не хотели бы использовать тасование, если только это не для школы. 😉

И если вы заинтересованы в производительности, вы определенно не можете использовать какое-либо решение, которое объединяет строки с «+».

Вот самое компактное решение, которое я мог бы придумать:

 public static String shuffle(String string) { if (StringUtils.isBlank(string) { return string; } final List randomChars = new ArrayList<>(); CollectionUtils.addAll(randomChars, ArrayUtils.toObject(string.toCharArray())); Collections.shuffle(randomChars); return StringUtils.join(randomChars, ""); } 

Какая раздражающая проблема. Наконец я закончил:

 import java.util.Collections; import com.google.common.primitives.Chars; import org.apache.commons.lang3.StringUtils; String shuffle(String s) { List chars = Chars.asList(s.toCharArray()); Collections.shuffle(chars); return StringUtils.join(chars.stream().toArray()); } 

Да, две библиотеки 🙂

Вы можете перебирать все символы, сравнивая каждый со следующим. Затем, если Math.rand ()> 0.5, замените этот символ следующим, иначе перейдите к следующему символу.

Вот код, который не требует ни рекурсии, ни преобразования в коллекцию.

 public static String shuffle(String string) { StringBuilder sb = new StringBuilder(string.length()); double rnd; for (char c: string.toCharArray()) { rnd = Math.random(); if (rnd < 0.34) sb.append(c); else if (rnd < 0.67) sb.insert(sb.length() / 2, c); else sb.insert(0, c); } return sb.toString(); } 
  String shuffled; do { shuffled = Stream.of(text.split("")).sorted((o1, o2) -> ThreadLocalRandom.current().nextInt(3) - 1).collect(Collectors.joining()); }while(shuffled.equals(text)); 

Если вы все еще хотите восстановить исходную String позже, попробуйте что-то вроде этого:

 public static class ShuffledString { private List indices; private String string; public ShuffledString(List indices, String string) { this.indices = indices; this.string = string; } public List getIndices() { return indices; } public String getRegularString() { StringBuilder stringBuilder = new StringBuilder(); for (int stringIndex = 0; stringIndex < indices.size(); stringIndex++) { int characterIndex = indices.indexOf(stringIndex); stringBuilder.append(string.charAt(characterIndex)); } return stringBuilder.toString(); } } public static ShuffledString shuffle(String input) { List indices = new ArrayList<>(); StringBuilder output = new StringBuilder(input.length()); while (indices.size() < input.length()) { int randomIndex; while (indices.contains(randomIndex = (int) (Math.random() * input.length()))) { } indices.add(randomIndex); output.append(input.charAt(randomIndex)); } return new ShuffledString(indices, output.toString()); } 

Без внешних библиотек:

 static String shuffle(String string){ List list = string.chars().mapToObj(c -> new Character((char) c)) .collect(Collectors.toList()); Collections.shuffle(list); StringBuilder sb = new StringBuilder(); list.forEach(c -> sb.append(c)); return sb.toString(); } 
  • Выполнение другой java-программы из нашей java-программы
  • как скачать изображение с любой веб-страницы в java
  • Как получить частоту от результата fft?
  • Как создать кнопку динамически в android?
  • Записывать телефонные звонки на Android-телефоне?
  • ПРЕДУПРЕЖДЕНИЕ: невозможно изменить разрешения для всех:
  • Почему class Java должен быть сопоставимым?
  • CollapsingToolbarLayout не распознает прокрутку
  • getHeight возвращает 0 для всех объектов Android UI
  • Создайте PDU для Android, который работает с SmsMessage.createFromPdu () (GSM 3gpp)
  • Разница между getClass (). GetClassLoader (). GetResource () и getClass.getResource ()?
  • Давайте будем гением компьютера.