Metoda contain z Arrays nie wyszukuje wartości

0

Witam dwa dni temu chciałem zrobić losowanie bez powtórzeń miałem tablicę prymitywów, dowiedziałem się że metoda contain na liście prymitywów nie działa dzisiaj chciałem jej użyć w następującym kodzie szukanie pracownika po różnych parametrach przedstawiam kod szukania po wysokości zarobków

public static void search (Pracownik tab[],String type,String value){
if (type.equals("zarobki")){
			if (!Arrays.asList(tab).contains(new Integer(value))){// zamieniam tablicę typu  Pracownik na listę i chcę przeszukać czy znajduje się tam podana wartość(jest ona podana jako tekst dlatego zamieniam na Integer)
				System.out.println("Brak pracowników o tych zarobkach");
			}
			else{
				for (int i=0;i<tab.length;i++){
					if(tab[i].earnings==new Integer(value)){
						System.out.println(tab[i].getData());	
					}
				}
			}
		} 
}

Za każdym razem wywala mi że nie ma pracowników o tych zarobkach a są
Klasa pracownik zawiera następujące pola

String name, String surname, byte age, String pesel, int earnings,String post 

Oczywiście tablicę tworzę

Pracownik workers[]=new Pracownik[10]
//i potem pętla 
for(int i=0;i<workers.length;i++){
workers[i]=new Pracownik (PodajeWartosci)
} 

Nie wykluczone że źle interpretuję działanie metody contain, jeśli tak jest to poprosiłbym o jakąś wskazówkę jak to działa
Z góry dziękuję za pomoc :)

0

Przecież jak zrobisz Arrays.asList(tab) to dostaniesz listę wypełnioną pracownikami. contains nie sprawdza Ci wartości pól tych obiektów, tylko sprawdza (z użyciem equals) czy któryś z nich to ten, który przekazujesz jako argument.

contains

boolean contains(Object o)
Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).

0
  1. Dostaję listę typu Pracownik i element 1 będzie miał pola takie jak w klasie pracownik?(tak jak to działa w tablicy)
  2. Żeby contain zadziałał to muszę przekazać jako parametr obiekt klasy pracownik i wtedy on zostanie porównany z danymi w liście(wszystkie pola muszą się zgadzać żebym dostał true)?
  3. A czy jest inna możliwość zrobienia tego sprawdzenia oprócz użycia zmiennej boolean?
public static void search (Pracownik tab[],String type,String value){
boolean exist=false;
                for (int i=0;i<tab.length;i++){
                    if(tab[i].earnings==new Integer(value)){
                        System.out.println(tab[i].getData());    
                        exist=true
                    }
                }
If(!exist){
System.out.println("Nie ma takiego pracownika")
}
            }
}
 
0
  1. Dlaczego zarobki są typu String?
  2. Dlaczego tablicę tab przekazujesz jako argument do funkcji, ona powinna być polem w klasie. (Chyba, że masz kilka tablic z pracownikami).
  3. Nie rozumiem przydatności metody o sygnaturze void search. Dla pewnych zastosowań może wystarczyć metoda boolean search (znalazłem, nie znalazłem). Najbardziej ubiwersalna to
    ArrayList<Pracownik> search zwracająca listę wszystkich pracowników spełniających warunek.
... ArrayList<Pracownik> search(Pracownik[] tab, String type, int value){
   ArrayList<Pracownik> result = new ArrayList<Pracownik>();
   for(Pracownik p: tab){
       if(p.earnings == value){
         result.add(p);
       }
   }
   return result;
}
0
  1. Są inta. Tylko użytkownik podaje je w Stringu bo może wyszukaç pracownika po peselu,nazwisku,zarobkach i nie opłacało mi się tworzyć kilku zmiennych dlatego zmieniam wartość ze Stringa na Int
  2. Mam jedną tablicę w której jest 20 pracowników ale wykładowca chce żeby w metodzie main nie było funkcji. Program jest przygotowany żeby np. Dodać studentów
  3. Mam to zrobić na tablicach, gdybym mógł wykorzystać listy to nie byłoby by problemu
0
  1. Sprecyzuję, dlaczego szukane zarobki są typu String?
  2. Zupełnie nie rozumiem. Co to znaczy

wykładowca chce żeby w metodzie main nie było funkcji
, nie wolno wywołać, czy nie wolno zdefiniować? Jeśli nie wolno wywołać, to po Ci funkcja search? A zdefiniować nie wolno niezależnie od widzimisię wykładowcy.

  1. Co funkcja search ma zwrócić: lista jest zabroniona, void jest bez sensu. Kilka możliwości: wartość logiczna (czy znalazł), ilość znalezionych, tablica ze znalezionymi, indeks pierwszego pracownika spełniającego warunek.
0
  1. Zarobki są typu int w szukaniu są zamieniane ze Stringa na int ponieważ
    -Podaj po czym chcesz znaleźć pracownika do wyboru zarobki,pesel,nazwisko
    -podaj wartość (typu który wybrałeś)
    To co poda jest typu String żeby nie tworzyć dodatkowej zmiennej na zarobki. Ale zarobki w klasie pracownik są int
  2. Mam klasę test i w niej mam metodę main on nas uczy obiektowości muszę utworzyć nową klasę która zawiera metody które chcę użyć. Powinienem utworzyć obiek klasy Operacje i z niego wywoływać metody a nie statycznie dlatego nie mogę w metodzie main wpisać kodu z metody search
1
  1. W którym miejscu sugerowałem, że masz kod metody search przepisać do main? Sugerowałem takie rozwiązanie:
public class Foo{
    private Pracownik[] pracownicy = new Pracownik[20];
    public static void main(String[] args){
    ...
    }
    private static ... search(int value){ //argumentu `type` nie wykorzystujesz
    ... 
    }
}
  1. Dlaczego piszesz kod z wielokrotną konwersją Stringa na liczbę? Jeśli nie chcesz dodatkowej zmiennej (nie rozumiem dlaczego), to wywołaj tak:
search(new Integer(zarobkiJakoTekst.trim()));
0
  1. Rzeczywiście nie pomyślałem o tym
  2. Chętnie bym tak zrobił ale trzeba obiekt zrobić
1
  1. Skoro trzeba zrobić obiekt to go zrób, moja propozycja pasuje do kodu z obiektem. Natomiast Twoja funkcja static search nie pasuje.
public class Foo{
    private Pracownik[] pracownicy = new Pracownik[20];
    public static void main(String[] args){
       new Foo();
    }
    public Foo(){
    ...
    } 
    private ... search(int value){ //argumentu `type` nie wykorzystujesz
    ... 
    }
}
  1. Pomysł z przekazaniem szukanych zarobków w Stringu wyglądał by bardzo dziwacznie gdybyś szukał pracowników zarabiających tyle co pracownicy[0] - najpierw konwersja liczby na String, a potem wielokrotna konwersja Stringa na liczbę.
0

@bogdans cała moda wyszukiwania i wypisywania wygląda tak (muszę użyć typ a wartość musi być String bo taki jest odczyt od usera on podaje w konsoli typ i wartość)

	public  void search (Pracownik tab[],String type,String value){
		ArrayList <Pracownik> result=new ArrayList<Pracownik>();
		if (type.equals("zarobki")){
			// mogę tu zamienić Stringa na inta w taki sposób:
           // value=new Integer(value); nadpisanie wartości sprawdziłem niby to działa błędu nie wyrzuca (mogę wtedy wykonywać operacje matematyczne) ale wolę się upewnić
            // jeśli tak nie mogę to zrobię to w ten sposób
			int ernings=new Integer(value);
			for (int i=0;i<tab.length;i++){
				if(tab[i].earnings==ernings){
					result.add(tab[i]);
				}
			}
		}
		
		else if (type.equals("nazwisko")){
			for (int i=0;i<tab.length;i++){
				if(tab[i].surname.equals(value)){
					result.add(tab[i]);
				}
			}
		}
		
		else if(type.equals("pesel")){
			for (int i=0;i<tab.length;i++){
				if(tab[i].pesel.equals(value)){
					result.add(tab[i]);
				}
			}
		}

		if (result.isEmpty()){
			System.out.println("Brak pracownikach o wskazanych parametrach");
		}
		else{
			for(Pracownik p:result){
				System.out.println(p.getData());
			}
		}
	}
 

Ps ta metoda może być void bo ona wypisuje tylko pracowników którzy spełniają dane warunki
a tak wygląda kod wprowadzania danych od usera

String type=null;
			String value=null;
			System.out.println("Podaj po czym chcesz wyszukać pracownika\nOpcje do wyboru to: zarobki, nazwisko, pesel");
			type=s.next();
			type.trim().toLowerCase();
			System.out.println("Teraz podaj " + type + " tego pracownika");
			value=s.next();
			task.search(workers, type, value);
 

EDIT:
Poprawiłem kod metody Search

0

Metoda search nie powinna niczego wypisywać - przestaje wtedy być uniwersalna. Przecież możesz potrzebować tylko informacji ilu jest Kowalskich, albo chcesz zapisać do pliku informację o pracownikach, których zarobki wynoszą 2500. Będziesz wtedy szukać, ale nie będziesz niczego pisać na ekran.
Druga sprawa, informacji wypisanej na ekran do niczego nie wykorzystasz. Np. ile średnio zarabiają Nowakowie.
Funkcja szukająca zwraca rezultat szukania, jeśli chcesz go wyświetlić to robi to inna funkcja.

0

Czyli search powinna mi zwracać listę a jak chcę wypisać to powinienem utworzyć osobną metodę?
Jak coś to program ma wypisywać tych pracowników

0

Właśnie tak.

0

A ta metoda może być typu void i zadeklarować listę jako atrybut klasy? Łatwie będzię wypisać

1

Może być atrybutem klasy i raczej powinna być typu void. Atrybutem klasy powinna być też tablica pracownicy. Jeśli lista będzie atrybutem klasy, to metoda search nie może się tak zaczynać:

    public  void search (Pracownik tab[],String type,String value){
        ArrayList <Pracownik> result = new ArrayList<Pracownik>();

Twórz listę w konstruktorze (w deklaracji atrybutu) i zaczynaj tak:

    public  void search (Pracownik tab[],String type,String value){
        result.clear();
0

Dzięki za pomoc jednak kursy internetowe darmowe nie nauczą optymalizacji kodu :)
Praktyka to praktyka mam nadzieję że jak czytałeś moje posty nie jeżył Ci się włos na głowie :D

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