Member 13769403 Ответов: 3

Есть проблема сортировки вставки строк


Вот результат aa cc dd ee Koko Yoko Yolo ii

Я в замешательстве. Коко Йоко и Йоло это должно быть в самом начале, верно?
Я проверил весь код в течение 3 раз. Не мог найти никаких ошибок.
Пожалуйста, укажите, где я ошибся.
Да, я знаю, что это, вероятно, не самое оптимальное решение.

Что я уже пробовал:

class InsertionSort {	
       public static String[] sort (String a[]) {
		String key="0";
		int k=0;
		boolean If;
		String temp1,temp2;
		for (int i = 1; i <= a.length-1; i++) {
			If = false;
			key = a[i];
			for (int o = i-1; o > -1; o--) {
				boolean u;
				if (o==0) u = StrComp(a[o] , key);
				else u = (StrComp(a[o], key)) && (StrComp(key, a[o-1]));
				if (u) 
					{k = o; If = true; break; }
		
			}
			if (If==true){
				temp1 = temp2 = "-1";
			for (int o = k; o < i ; o++) {
				temp2 = a[o+1];
				if (temp1 == "-1")
				    a[o+1] = a[o];
			    else
					a[o+1] = temp1;
				temp1 = temp2;
			}
			a[k]=key;
		    }
		}
		return a;
    }
	public static Boolean StrComp (String a, String b) {
		if (a==b) return true;
		int alength=a.length()-1;
		int blength=b.length()-1;
		
		for (int i=0; i <= alength; i++){
					
			if (i <= blength){
				char cha = a.charAt(i);
				char chb = b.charAt(i);	
				if (cha != chb)
				if (cha > chb) 
			return true;}
		else return true;
		}
		return false;
	}	
}
		
		


class Insertion1 {
    public static void main(String args[]){
		 String array2[] = {"aa","ii","cc", "dd", "ee", "Yoko", "Koko", "Yolo"};
		 
		 array2 = InsertionSort.sort(array2);
		 for (String i: array2) System.out.print(i + " ");
	}
}

RickZeeland

Я не программист на Java, но я попробовал код на https://www.tutorialspoint.com/compile_java8_online.php и обнаружил, что когда все строки строчные, это работает так, как ожидалось. Так что, возможно, совет должен быть таким: используйте .NET :)

Member 13769403

К сожалению, я с ними не знаком .Net пока нет. В моем браузере он почему-то вообще не компилируется (по ссылке, которую вы дали) o_O .

RickZeeland

Просто шучу, я использовал браузер Microsoft Edge и сделал класс Insertion1 общедоступным, удачи !

3 Ответов

Рейтинг:
15

Patrice T

Цитата:
Вот вывод aa cc dd ee Koko Yoko Yolo ii

Можно видеть, что все строки длины 2 находятся в порядке, и каждая строка длины 4 также находится в порядке.
Это приводит к подозрению в сравнении строк.

Чтобы понять, насколько это неправильно, лучше всего использовать отладчик и посмотреть, что произойдет, когда функция сравнивает строку длины 2 с другой строкой длины 4.

Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Member 13769403

Танк ты! Я все правильно понял! Я просто пропустил одно обратное утверждение.
public static Boolean StrComp (String a, String b) {

if (a==b) return true;
int alength=a.length()-1;
int blength=b.length()-1;

for (int i=0; i <= alength; i++){

если (i <= blength){
чар ча = а.используя метод charat(я);
чар ЧБ = б.используя метод charat(я);
если (ча != ЧБ)
если (cha > chb)
вернуть true;
else return false;}
else return true;
}
возвращать false;
}

Patrice T

Приятно видеть, что ты все сделал правильно.

Рейтинг:
1

Member 13769403

Для ints это работает просто отлично. Проблемы возникают только со строками.
(Однако читать руководство-это худшее предложение. Никогда больше так не делай)

Richard MacCutchan

Напротив, читать инструкцию - лучшее предложение. Если бы больше людей тратили больше времени на чтение руководств, у нас не было бы так много провальных крупных проектов.

Рейтинг:
0

RickZeeland

Проблема заключается в вашем StrComp() функция, она должна быть:

public static Boolean StrComp (String a, String b) {
		if (a==b) return true;
		
		int alength=a.length()-1;
		int blength=b.length()-1;
		
		for (int i=0; i <= alength; i++){
					
			if (i <= blength){
				char cha = a.charAt(i);
				char chb = b.charAt(i);	
				// if (cha != chb)
				if (cha > chb) 
			        return true;
			    else
			        return false;
			}
		    else return true;
		}
		return false;
	}