Incompatible types. Float a String

0

Witam. Mam mały problem w moim programie. Mianowicie chce zrobić wyszukiwanie (podanych wcześniej przeze mnie informacji: nazwisko, średnia, uwagi) Udało mi się zrobić wyszukiwanie po nazwisku, i uwagach (Stringi), ale nie wychodzi mi coś wyszukiwanie po średniej (float). Typy zmiennych gryzą mi się w programie i nie za bardzo mogę dojść do tego co powinienem zmienić. Będę wdzięczny za wszelką pomoc :)

package baza0;
import javax.swing.*;
import java.util.*;

class Osoba 
 { String nazwisko;
   float srednia;
   String uwagi;
    
   public  void Nadaj_nazwisko(String lan)
    { nazwisko=lan;}
   public String Podaj_nazwisko()
    { return nazwisko;}
   public  void Nadaj_uwagi(String lan)
    { uwagi=lan;}
   public String Podaj_uwagi()
     { return uwagi;}
   public  void Nadaj_srednia(float srednia_)
    { srednia=srednia_;} 
  public float Podaj_srednia()
     {return srednia;}

  public String toString()
   {String napis="";
    napis+="Nazwisko: "+nazwisko;
    napis+=" Srednia: "+srednia;
    napis+=" Uwagi: "+uwagi;
    return napis;
   }
   
  public boolean Szukajnazw(String s) 
   { 
       return nazwisko.equals(s);
   }
  
  public boolean Szukajuwagi(String a) 
   { 
       return uwagi.equals(a);
   }
  
   public boolean Szukajsrednia(Object o)
   {  
      //Osoba d = (Osoba)o;
      return srednia==srednia;
   } 
   
   
   /*public boolean equals(Object o) //metoda umozliwiajaca przetwarzanie w pojemnikach typu Hash
   { Dane1 d=(Dane1)o;
     return  nazwisko.equals(d.nazwisko)
             && srednia==d.srednia
             && uwagi.equals(d.uwagi);
   }
      
  public int hashCode()  //metoda umozliwiajaca przetwarzanie w pojemnikach  typu Hash
   {return nazwisko.hashCode()+(int)srednia+uwagi.hashCode(); 
    } */ 
 
   
}
class  Tablica
{    
  Osoba Dane[]=null; 
  int ile=0;  
  
  public boolean Pusta()
    {
      return ile==0;
    }
  
  public boolean Pelna()
    {
      return ile==Dane.length;
    }
 public int Podaj_ile()
   {
     return ile;
   }
 
  public void Wykonaj_tablice(int N)
   {
      ile=0;
      Dane=new Osoba[N]; //utworzenie tablicy
   }
  
  public void Wstaw (String nazwisko_, float srednia, String uwagi_)
   {
      Osoba dana=new Osoba();
      dana.Nadaj_nazwisko(nazwisko_);
      dana.Nadaj_srednia(srednia);
      dana.Nadaj_uwagi(uwagi_);
      Dane[ile]=dana;
      ile++; 
   }
  
   public Osoba Wyszukaj_nazw(String s)
    {
      for (int i=0; i<ile;i++)
       if (Dane[i].Szukajnazw(s))
        return   Dane[i];
      return null;
    }
   
   public Osoba Wyszukaj_uwagi(String a)
    {
      for (int i=0; i<ile;i++)
       if (Dane[i].Szukajuwagi(a))
        return   Dane[i];
      return null;
    }
   
   public Osoba Wyszukaj_srednia(float z)
    {
      for (int i=0; i<ile;i++)
       if (Dane[i].Szukajsrednia(z))
        return   Dane[i];
      return null;
    }
   
   public String toString()
   {
       String s="";
       for (int i=0; i<ile; i++)
         s+=Dane[i].toString()+"\n";
       return s;
   }
}

public class Baza0
{ 
  protected Tablica tablica=new Tablica();
  
  public void Wyswietl()
     {
      if (tablica.Pusta())//jesli tablica istnieje, to można wyswietlac
           JOptionPane.showMessageDialog(null,"Brak danych"); 
      else 
        JOptionPane.showMessageDialog(null,tablica.toString()); 
    }
  
  public void Wypelnij()
    { String S;
      S=JOptionPane.showInputDialog(null,"Podaj rozmiar tablicy");
      int N=Integer.parseInt(S);
      tablica.Wykonaj_tablice(N); //utworzenie tablicy
      String S1,S2,S3;
      while(!tablica.Pelna()) //jeśli tablica jes zapełniona, tak jest równe false
       { 
         S1 = JOptionPane.showInputDialog(null, "Podaj nazwisko"); 
         S2 = JOptionPane.showInputDialog(null, "Podaj srednia");
         S3 = JOptionPane.showInputDialog(null, "Podaj uwagi");
         tablica.Wstaw(S1, Float.parseFloat(S2), S3);//dopisanie danych na końcu danych
       }  
    }
 
   public void Wyszukaj_nazw()
   {
     if (tablica.Pusta())//jesli tablica istnieje, to mozna wyswietlac
           JOptionPane.showMessageDialog(null,"Brak danych"); 
     else
     {
      String S = JOptionPane.showInputDialog(null,"Podaj nazwisko");
      Object osoba=tablica.Wyszukaj_nazw(S);   
      if(osoba!=null)
       JOptionPane.showMessageDialog(null, osoba.toString());
      else
       JOptionPane.showMessageDialog(null, "Brak osób o podanym nazwisku");
     }
   }
     
     public void Wyszukaj_uwagi()
   {
     if (tablica.Pusta())
           JOptionPane.showMessageDialog(null,"Brak danych"); 
     else
     {
      String A = JOptionPane.showInputDialog(null,"Podaj Uwagi");
      Object osoba=tablica.Wyszukaj_uwagi(A);   
      if(osoba!=null)
       JOptionPane.showMessageDialog(null, osoba.toString());
      else
       JOptionPane.showMessageDialog(null, "Brak osób o podanym uwagach");
     }
   }
     
     public void Wyszukaj_srednia()
   {
     if (tablica.Pusta())
           JOptionPane.showMessageDialog(null,"Brak danych"); 
     else
     {
      String Z = JOptionPane.showInputDialog(null,"Podaj średnią");
      Object osoba=tablica.Wyszukaj_srednia(Z);   
      if(osoba!=null)
       JOptionPane.showMessageDialog(null, osoba.toString());
      else
       JOptionPane.showMessageDialog(null, "Brak osób o podanej średniej");
     }
     
   }
   
   static public  void main(String args[])
   {  Baza0 baza1=new Baza0(); //referencja do tablicy, która jest tworzona w opcji 1
      char ch;
      String s;
      do
      { s=JOptionPane.showInputDialog(null, "Progam nie jest zabezpieczony przed\n" +
                "złym formatem danych i naciskaniem\nCancel w okienkach dialogowych.\n"+
                "\nPodaj wybor: "
        +"\n1 - Wypełnij tablice danymi osobowymi"
        +"\n2 - Wyświetl dane wszystkich podanych osób"
        +"\n\n3 - Wyszukaj osobe (wg. nazwiska) i wyświetl jej dane"
        +"\n4 - Wyszukaj osobe (wg. sredniej) i wyświetl jej dane"
        +"\n5 - Wyszukaj osobe (wg. uwag) i wyświetl jej dane"
        +"\n\n6 - Usuń osobe"
        +"\n\nk - Koniec programu");
      ch = s.charAt(0);  //pobranie opcji
      switch(ch)
       {case '1' : baza1.Wypelnij();
                   break;
        case '2' : baza1.Wyswietl();       
                   break;
        case '3' : baza1.Wyszukaj_nazw(); 
                   break;  
        case '4' : baza1.Wyszukaj_srednia(); 
                   break; 
        case '5' : baza1.Wyszukaj_uwagi(); 
                   break;
        case 'k' : JOptionPane.showMessageDialog(null, "Koniec programu");
                   break;
        default  : JOptionPane.showMessageDialog(null,"Zla opcja");       
    }
 }while (ch != 'k') ;
 System.exit(0); 
  }
}

0

Co to w ogóle ma zwracać?

public boolean Szukajsrednia(Object o)
   {  
      //Osoba d = (Osoba)o;
      return srednia==srednia;
   }

Czy nie powinieneś tego porównywać z przekazywanym argumentem?

0

Faktycznie ten zapis jest chyba bez sensu... Wynikł on z tego, że męczę się już nad tym trochę i takie bzdury wychodzą... Więc jak powinienem to zrobić? Nie mogę zastosować metody equals tak jak to robiłem ze stringami?

1

Powyższa metoda jest wywoływana z tej:

public Osoba Wyszukaj_srednia(float z)
    {
      for (int i=0; i<ile;i++)
       if (Dane[i].Szukajsrednia(z))
        return   Dane[i];
      return null;
    }

w Wyszukaj_srednia przekazujesz argument typu float, który następnie wędruje do Szukajsrednia

public boolean Szukajsrednia(Object o)
   {  
      //Osoba d = (Osoba)o;
      return srednia==srednia;
   }

czemu dajesz tutaj argument typu object? Jeśli będziesz chciał potem porównać będzie to wymagało niepotrzebnego rzutowania.
Zmienna srednia jest typu float więc można to porównać po prostu operatorem ==, gdyż oba są typami prostymi. Więc ja bym zrobił to tak:

public boolean Szukajsrednia(float f)
   {  
      return srednia==f;
   }

ale błąd jest wcześniej:

  public void Wyszukaj_srednia()
   {
     if (tablica.Pusta())
           JOptionPane.showMessageDialog(null,"Brak danych"); 
     else
     {
      String Z = JOptionPane.showInputDialog(null,"Podaj średnią");
      Object osoba=tablica.Wyszukaj_srednia(Z);   
      if(osoba!=null)
       JOptionPane.showMessageDialog(null, osoba.toString());
      else
       JOptionPane.showMessageDialog(null, "Brak osób o podanej średniej");
     }
 
   }

dokładniej w linijce

Object osoba=tablica.Wyszukaj_srednia(Z);   

Metoda wymaga argumentu float a Ty przekazujesz mu argument typu String: String Z = JOptionPane.showInputDialog(null,"Podaj średnią");


Po prostu po odczytaniu zmiennej Z a przed rozpoczęciem wyszukiwania skonwertuj Stringa na typ prosty float:

```java
      String Z = JOptionPane.showInputDialog(null,"Podaj średnią");
      float f = Float.parseFloat(Z);
      Object osoba=tablica.Wyszukaj_srednia(f);   
0

Świetnie to wytłumaczyłeś, teraz wszystko rozumiem i program śmiga. Nie ruszałem programowania przez całe wakacje a z Java dopiero zaczynam stąd te głupoty co pisze. Jeszcze raz wielkie dzięki :)

0

Znowu ja :) Mianowicie teraz chce zrobić, aby można było usuwać osoby z tablicy wg podanego kryterium tzn. podaje nazwisko, a program usuwa mi osobę z bazy i jej dane( średnia i uwagi. Wiem, że muszę zmniejszyć rozmiar tablicy, ale nie wiem jak to zrobić w zależności, na którym miejscu znajdzie mi szukane nazwisko... problem pewnie banalny, ale jednak. Jeszcze raz mój kod:

package baza0;
import javax.swing.*;
import java.util.*;

class Osoba 
 { String nazwisko;
   float srednia;
   String uwagi;
    
   public  void Nadaj_nazwisko(String lan)
    { nazwisko=lan;}
   public String Podaj_nazwisko()
    { return nazwisko;}
   public  void Nadaj_uwagi(String lan)
    { uwagi=lan;}
   public String Podaj_uwagi()
     { return uwagi;}
   public  void Nadaj_srednia(float srednia_)
    { srednia=srednia_;} 
  public float Podaj_srednia()
     {return srednia;}

  public String toString()
   {String napis="";
    napis+="Nazwisko: "+nazwisko;
    napis+=" Srednia: "+srednia;
    napis+=" Uwagi: "+uwagi;
    return napis;
   }
   
  public boolean Szukajnazw(String s) 
   { 
       return nazwisko.equals(s);
   }
  
  public boolean Szukajuwagi(String a) 
   { 
       return uwagi.equals(a);
   }
  
  public boolean Szukajsrednia(float f)
   {  
      return srednia==f;
   }
  
    
}

class  Tablica
{    
  Osoba Dane[]=null; 
  int ile=0;  
  
  public boolean Pusta()
    {
      return ile==0;
    }
  
  public boolean Pelna()
    {
      return ile==Dane.length;
    }
 public int Podaj_ile()
   {
     return ile;
   }
 
  public void Wykonaj_tablice(int N)
   {
      ile=0;
      Dane=new Osoba[N]; //utworzenie tablicy
   }
  
  public void Wstaw (String nazwisko_, float srednia, String uwagi_)
   {
      Osoba dana=new Osoba();
      dana.Nadaj_nazwisko(nazwisko_);
      dana.Nadaj_srednia(srednia);
      dana.Nadaj_uwagi(uwagi_);
      Dane[ile]=dana;
      ile++; 
   }
  
   public Osoba Wyszukaj_nazw(String s)
    {
      for (int i=0; i<ile;i++)
       if (Dane[i].Szukajnazw(s))
        return   Dane[i];
      return null;
    }
   
   public Osoba Wyszukaj_uwagi(String a)
    {
      for (int i=0; i<ile;i++)
       if (Dane[i].Szukajuwagi(a))
        return   Dane[i];
      return null;
    }
   
   public Osoba Wyszukaj_srednia(float z)
     {
     for (int i=0; i<ile;i++)
     if (Dane[i].Szukajsrednia(z))
     return   Dane[i];
     return null;
    }
   
   public Osoba Usun_nazw(String d)
   {
       for (int i=0; i<ile;i++)
       if (Dane[i].Szukajnazw(d))
       //algorytm
       return null;
   }
   
   public String toString()
   {
       String s="";
       for (int i=0; i<ile; i++)
         s+=Dane[i].toString()+"\n";
       return s;
   }
   
   public int usun_all()
   {
       return ile=0;
   }
      
}

public class Baza0
{ 
  protected Tablica tablica=new Tablica();
  
  public void Wyswietl()
     {
      if (tablica.Pusta())//jesli tablica istnieje, to można wyswietlac
           JOptionPane.showMessageDialog(null,"Brak danych"); 
      else 
        JOptionPane.showMessageDialog(null,tablica.toString()); 
    }
  
  public void Wypelnij()
    { String S;
      S=JOptionPane.showInputDialog(null,"Podaj rozmiar tablicy");
      int N=Integer.parseInt(S);
      tablica.Wykonaj_tablice(N); //utworzenie tablicy
      String S1,S2,S3;
      while(!tablica.Pelna()) //jeśli tablica jes zapełniona, tak jest równe false
       { 
         S1 = JOptionPane.showInputDialog(null, "Podaj nazwisko"); 
         S2 = JOptionPane.showInputDialog(null, "Podaj srednia");
         S3 = JOptionPane.showInputDialog(null, "Podaj uwagi");
         tablica.Wstaw(S1, Float.parseFloat(S2), S3);//dopisanie danych na końcu danych
       }  
    }
 
   public void Wyszukaj_nazw()
   {
     if (tablica.Pusta())//jesli tablica istnieje, to mozna wyswietlac
           JOptionPane.showMessageDialog(null,"Brak danych"); 
     else
     {
      String S = JOptionPane.showInputDialog(null,"Podaj nazwisko");
      Object osoba=tablica.Wyszukaj_nazw(S);   
      if(osoba!=null)
       JOptionPane.showMessageDialog(null, osoba.toString());
      else
       JOptionPane.showMessageDialog(null, "Brak osób o podanym nazwisku");
     }
   }
     
     public void Wyszukaj_uwagi()
   {
     if (tablica.Pusta())
           JOptionPane.showMessageDialog(null,"Brak danych"); 
     else
     {
      String A = JOptionPane.showInputDialog(null,"Podaj Uwagi");
      Object osoba=tablica.Wyszukaj_uwagi(A);   
      if(osoba!=null)
       JOptionPane.showMessageDialog(null, osoba.toString());
      else
       JOptionPane.showMessageDialog(null, "Brak osób o podanym uwagach");
     }
   }
     
     public void Wyszukaj_srednia()
   {
     if (tablica.Pusta())
           JOptionPane.showMessageDialog(null,"Brak danych"); 
     else
     {
      String Z = JOptionPane.showInputDialog(null,"Podaj średnią");
      float f = Float.parseFloat(Z);
      Object osoba=tablica.Wyszukaj_srednia(f);  
      if(osoba!=null)
      JOptionPane.showMessageDialog(null, osoba.toString());
      else
       JOptionPane.showMessageDialog(null, "Brak osób o podanej średniej");
     }
     
   }
     
     public void Usun_wszystkich()
     {  
        tablica.usun_all();
        JOptionPane.showMessageDialog(null, "Baza osób została wyczyszczona");
     }
     
     public void Usun_nazw()
     {
         if (tablica.Pusta())
         JOptionPane.showMessageDialog(null,"Brak danych"); 
     else
     {
          String A = JOptionPane.showInputDialog(null,"Podaj nazwisko które chcesz usunąć");
          Object osoba=tablica.Usun_nazw(A);
          if(osoba!=null)
          JOptionPane.showMessageDialog(null, osoba.toString());
          else
          JOptionPane.showMessageDialog(null, "Osoba o podanym nazwisku została usunięta");
     }
     }
   
   static public  void main(String args[])
   {  Baza0 baza1=new Baza0(); //referencja do tablicy, która jest tworzona w opcji 1
      char ch;
      String s;
      do
      { s=JOptionPane.showInputDialog(null, "Progam nie jest zabezpieczony przed\n" +
                "złym formatem danych i naciskaniem\nCancel w okienkach dialogowych.\n"+
                "\nPodaj wybor: "
        +"\n1 - Wypełnij tablice danymi osobowymi"
        +"\n2 - Wyświetl dane wszystkich podanych osób"
        +"\n\n3 - Wyszukaj osobę (wg. nazwiska) i wyświetl jej dane"
        +"\n4 - Wyszukaj osobę (wg. sredniej) i wyświetl jej dane"
        +"\n5 - Wyszukaj osobę (wg. uwag) i wyświetl jej dane"
        +"\n\n6 - Usuń wszystkie osoby"
        +"\n7 - Usun osobę (wg. nazwiska)"
        +"\n\nk - Koniec programu");
      ch = s.charAt(0);  //pobranie opcji
      switch(ch)
       {case '1' : baza1.Wypelnij();
                   break;
        case '2' : baza1.Wyswietl();       
                   break;
        case '3' : baza1.Wyszukaj_nazw(); 
                   break;  
        case '4' : baza1.Wyszukaj_srednia(); 
                   break; 
        case '5' : baza1.Wyszukaj_uwagi(); 
                   break;
        case '6' : baza1.Usun_wszystkich();
                   break;
        case '7' : baza1.Usun_nazw();
                   break;
        case 'k' : JOptionPane.showMessageDialog(null, "Koniec programu");
                   break;
        default  : JOptionPane.showMessageDialog(null,"Zla opcja");       
    }
 }while (ch != 'k') ;
 System.exit(0); 
  }
}

Zapewne potrzebny algorytm do tego powinien znajdować się w tym miejscu:

public Osoba Usun_nazw(String d)
   {
       for (int i=0; i<ile;i++)
       if (Dane[i].Szukajnazw(d))
       //algorytm
       return null;

Najlepsze, co do tej pory udało mi się wymyślić to usuwanie osoby z ostatniego miejsca poprzez zmniejszenie rozm. tablicy, ale przecież nie o to w tym chodzi :/

0

W pierwszej wersji programu do przechowywania osób używałeś kolekcji ArrayList<Osoba>. Jeśli chcesz usuwać, to powinieneś chyba wrócić do tego pomysłu. Jeśli zostawisz tablicę, to po znalezieniu osoby na miejscu k musisz przepisać w pętli osobę z pozycji k+1 na pozycję k, z pozycji k+2 na pozycję k+1 itd. A na końcu zmniejszyć o 1 wartość pola ile.

0

Nie do końca niestety ogarniam to ArrayList :/ Napisałem coś takiego:

public Osoba Usun_nazw(String d)
   {
       for (int i=0; i<ile;i++)
       {
       if (Dane[i].Szukajnazw(d))
           Dane[i]=Dane[i+1];
       }
       ile--;
       return null;

Ale niestety nie działa do końca zbyt dobrze. Próbowałem wielu rozwiązań i albo źle przepisywało dane w tablicy, albo np rozmiar był zmniejszany dwa razy. Już nie mam pomysłów jak to zrobić...
EDIT: Próbowałem też zagnieżdżone pętle i tam chyba dobrze przepisywało, tylko z tym rozmiarem tablicy były problemy. Teraz zauważyłem, że w podanym przeze mnie rozw. przepisuje dane tylko raz...

Wersja z zagnieżdżoną pętlą, ale też nie działa, nie mam pojęcia czemu...

public Osoba Usun_nazw(String d)
   {
       for (int i=0; i<ile;i++)
       {
       if (Dane[i].Szukajnazw(d))
           for (int j=i; j<ile; j++)
           {
           Dane[j]=Dane[j+1];
           }
       
       }
       ile--;
       return null;
   }

Jeszcze inna wersja i kurde na logikę wydaje mi się, że wszystko powinno być dobrze, ale gdzieś widocznie popełniam błąd...

public Osoba Usun_nazw(String d)
   {
       for (int i=0; i<ile; i++)
       {
       if (Dane[i].Szukajnazw(d))
           for (int j=0; j<ile; j++)
           {
           Dane[j+i]=Dane[j+i+1];
           }
       }
       ile--;
       return null;
   }

Tutaj wywala program, więc zapewne coś z pamięcią podczas przepisywania/zmniejszania tablicy...

1 użytkowników online, w tym zalogowanych: 0, gości: 1