• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

błąd w sorotowaniu

Object Storage Arubacloud
0 głosów
359 wizyt
pytanie zadane 24 marca 2021 w Java przez Hubert731 Obywatel (1,650 p.)

Polecenie: https://szkopul.edu.pl/problemset/problem/tel/site/?key=statement

cały czas, kiedy dodaje opcje: " Float.compare(p1, p2)==0" w 38 wierszu, wyrzuca mi blad, nie mam pojecia dlaczego, bez tego dziala, ale jest blad w sortowaniu, poniewaz telefony o takiej samej dlugosci i takich samcyh przekatncyh powinny byc wypisane w tej samej kolejnosci, a metoda sortowanie mi ja zmienia.

package oki;

import java.util.Scanner;

public class Salon_Telefanatic {

	static String telefony[];
	static int n;
	
	public static void main(String[] args) {
		//wczytanie
		System.out.println("Wczytaj n:");
		n = new Scanner(System.in).nextInt();
		telefony = new String [n];
		for(int i=0; i<n; i++) {
			System.out.println(i+1+". telefon");
		    telefony[i]= new Scanner(System.in).nextLine();	
		}

		for(int i=0; i<n; i++) {
			System.out.println(i+1+". telefon: "+telefony[i]);
		}
		
		sortowanie(telefony, 0, telefony.length-1);
		System.out.println("-----------");
		for(int i=0; i<n; i++) {
			System.out.println(i+1+". telefon: "+telefony[i]);
		}	
	
	}
	
	//metoda sprawdzenia ktory telefon powinien byc wczesniej
	public static boolean ktory_tel_wczesniej(String dlugosc_nazwy, Float p1, String dlugosc_nazwy2, Float p2) {
		if(dlugosc_nazwy.length()<dlugosc_nazwy2.length()) {
			return true;
		}
		else if(dlugosc_nazwy.length()==dlugosc_nazwy2.length()) {
		if(Float.compare(p1, p2)==-1 || Float.compare(p1, p2)==0) {
			return true;
		}
		else {
			return false;
		}
		}
		else return false;
	}
	
	public static String nazwa(String a) {
		String wynik="";
		int spacja=0;
		for(int i=0; i<a.length(); i++) {
			if(a.charAt(i)==' ') spacja++;
			if(spacja==2) break;
			else wynik=wynik+a.charAt(i);
		}
		return wynik;
	}
	
	public static float przekatne(String a) {
		String y = "";
		String x = "";
		int spacja=0;
		for(int i=0; i<a.length()-1; i++) {
			if(a.charAt(i)==' ') spacja++;
			if(spacja==2) x=x+a.charAt(i);
			else if(spacja==3) y=y+a.charAt(i+1);
		}
		return (float) (Float.parseFloat(y)/Float.parseFloat(x));
	}
	
	public static void sortowanie(String tablica[], int begin, int end) {
		int i, j;
		String v, temp;
		
		i=begin;
		j=end;
		v=tablica[(begin+end)/2];
		do {
			while(ktory_tel_wczesniej(nazwa(tablica[i]),przekatne(tablica[i]), nazwa(v),przekatne(v))) i++;
			while(ktory_tel_wczesniej(nazwa(v),przekatne(v),nazwa(tablica[j]),przekatne(tablica[j]))) j--;
			
			if(i<=j) {
				temp = tablica[i];
				tablica[i] = tablica[j];
				tablica[j] = temp;
				i++;
				j--;
			}
		}
		while(i<=j);
		
		if(begin<j) sortowanie(tablica, begin,j);
		if(i<end) sortowanie(tablica, i, end);
	}	
}

 

komentarz 25 marca 2021 przez Hubert731 Obywatel (1,650 p.)
nie chce tak zrobic, bo wychodza bledy, np. porownujac 2.611 i 2.611 jest falsz.
komentarz 25 marca 2021 przez Hubert731 Obywatel (1,650 p.)
Wychodzi poza zakres tablicy, poniewaz boolean w petli while jest true, kiedy obie dlugosci sa takie same, wiec musze to " Float.compare(p1, p2)==0" usunac, ale teraz musze cos wymyslic w metodzie sortowanie, zeby nic mi nie sortowalo, kiedy sa takie same dlugosci
komentarz 25 marca 2021 przez adrian17 Ekspert (344,860 p.)

np. porownujac 2.611 i 2.611 jest falsz

Tak, bo - tak jak pisałem wcześniej - używasz błędnie Float (wielka litera, obiekt) zamiast float (mała litera, wartość). Patrz:

        Float a = Float.parseFloat("2.611");
        Float b = Float.parseFloat("2.611");
        System.out.println(a == b);
        // -> false
        
        float x = Float.parseFloat("2.611");
        float y = Float.parseFloat("2.611");
        System.out.println(x == y);
        // -> true

 

komentarz 25 marca 2021 przez adrian17 Ekspert (344,860 p.)

Wychodzi poza zakres tablicy, poniewaz boolean w petli while jest true, kiedy obie dlugosci sa takie same, wiec musze to " Float.compare(p1, p2)==0" usunac

Wciąż nie rozumiesz że funkcja sortująca powinna działać bez sypania się niezależnie co zwróci funkcja porównująca. Błąd masz w funkcji sortującej, zacznij patrzeć na te indeksy.

komentarz 25 marca 2021 przez Hubert731 Obywatel (1,650 p.)
Faktycznie, bład był w funkcji porównującej, spróbowałem z funkcja sortujaca metoda "babelkowa" i działa poprawnie, minus jest taki, ze przy wiekszych danych, gdzie wprowadzam przykladowo 100000 telefonow, program dziala baaardzo wolno, a parktycznie nie dziala. Nie wiem czy tak samo byloby by, gdybym zrobil to metoda quicksort.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 388 wizyt
0 głosów
1 odpowiedź 161 wizyt
pytanie zadane 22 lipca 2020 w Python przez PanPrezes Obywatel (1,520 p.)
0 głosów
1 odpowiedź 172 wizyt
pytanie zadane 25 czerwca 2020 w Python przez PanPrezes Obywatel (1,520 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...