Всем привет. Я относительно недавно начал изучать Java. Есть некоторые затруднения. У меня задание отсортировать строчку по количеству букв в ней используя StringBuilder, к примеру hhhheeeeelllo после сортировки должно быть таким eeeeehhhhlllo. Но у меня иначе к примеру hhhhhhheeeeeelllllllllo консоль выводит мне это hhhhhheeeeeehlllllllllо. Также нельзя использовать коллекци. Я представляю как должно выглядеть на С++ и попытался также сделать, но так у меня вообще не работает поэтому я его за комментировал. Помогите пожалуйста. Заранее благодарен.
Цикл должен выглядеть так, как я понимаю
for(int i = 1; i<s.length(); i++) {
for(int j = s.length()-1; j>=i; j--) {
if(word[j-1] > word[j]) {
....
}
}
}
А вот собственно мой код
class StringBuilder {
public void sorting_stringBuilder(String s) {
int i,j;
char temp;
java.lang.StringBuilder news = new java.lang.StringBuilder(s);
for(i=1; i<s.length(); i++) {
for(j=s.length() - 1; j >= i; j--) {
if((int) news.charAt(j-1) > (int) news.charAt(j)) {
temp = news.charAt(i);
//news.charAt(j-1) = news.charAt(j);
//news.charAt(j) = temp;
news.setCharAt(i, news.charAt(j-1));
news.setCharAt(j-1, temp);
}
}
}
System.out.println("s is = "+news);
}
}
public class Laba3 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.sorting_stringBuilder("hhhhhhheeeeeelllllllllo");
}
}
А задача не простая. То что вы делаете - это что-то вроде сортировку пузрьком, но по алфавиту. По факту вам нужно подсчитать количество вхождений каждого символа в строке и потом воссоздать строку заново.
Конечно проще всего это было бы сделать с помощью Map или даже Stream из java8. Но раз использовать коллекции нельзя...
Я думаю по проcтому это невозможно, из-за того, что нам нужно держать соответсвие между "символом - сколько раз встречается".
То что я могу предложить это вот это:
String input = "hhhheeello";
int[] symbols = new int[256];
for (byte current: input.getBytes(StandardCharsets.UTF_8))
symbols[current]++;
StringBuilder builder = new StringBuilder();
// Аля сортировка подсчетом
for (int count = 1; count < input.length(); count++)
// Смортрим какие символы есть с количеством count
for (char charCode = 0; charCode < symbols.length; charCode++)
if (symbols[charCode] == count)
for (int i = 0; i < count; i++) builder.append(charCode);
System.out.println(builder.toString());
Это лишь один из возможных извращенных вариантов. Конечно его можно и улучшить. Скажем можно от StringBuilder вообще избавится. Но все равно проблемы очевидны, и для больших строк будет работать плохо. Да и в любом случае выглядит страшненько - вариант на коллекциях будет попроще и читабельнее.
Если в лоб - то можно использовать что-то подобное:
public static void main(String[] args) {
StringBuilder s = new StringBuilder("hhhheeeeelllo ");
System.out.println(sort(s));
}
public static StringBuilder sort(StringBuilder sb) {
char[] chars = sb.toString().toCharArray();
Arrays.sort(chars);
return new StringBuilder(new String(chars));
}
Задачка понравилась. Решил через определение компаратора.
String input = "hhhheeeeelllo";
char[] chars = input.toCharArray();
Function<char[], Character[]> toCharacterArray = chars1 -> {
Character[] characters = new Character[chars1.length];
for (int i = 0; i < chars1.length; i++)
characters[i] = (Character) chars1[i];
return characters;
};
Character[] characters = toCharacterArray.apply(chars);
Function<Character, Integer> charCount = c1 -> input.length() - input.replaceAll(c1.toString(), "").length();
Arrays.sort(characters);
Arrays.sort(characters, (c1, c2) -> charCount.apply(c2) - charCount.apply(c1));
StringBuilder sb = new StringBuilder();
for (char c : characters) {
sb.append(c);
}
System.out.println(sb.toString());
Сборка персонального компьютера от Artline: умный выбор для современных пользователей