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.

  3. 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
    ... 
    }
    }
  2. 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
    ... 
    }
    }
  2. 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ę.

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