Filtro di ricerca Java

myblacksloth

Nuovo Utente
11 Feb 2017
1
0
1
Salve a tutti,
devo implementare un filtro di ricerca per questo programma
https://github.com/myblacksloth/javaPrograms/blob/master/HotelManagement/README.md
ma ho dei seri problemi a fare ciò...

Per adesso ho implementato un interfaccia grafica che in base alle voci selezionate passa parametri diversi al filtro di ricerca ma non so se questo modo vada bene.
Di seguito inserisco il codice:

oggetto restituito dal filtro di ricerca
Codice:
package com_antomau_HotelManagement.Structure.Finder;


import com_antomau_HotelManagement.MyObjects.MyRoom;
import com_antomau_HotelManagement.MyObjects.MyHotel;


/**
 * Created by Antonio Maulucci http://www.antomau.com on 09/02/17.
 */
public class FinderObj {


    //variabili
    MyRoom r;
    MyHotel h;


    public FinderObj(MyHotel h, MyRoom r)
    {






        this.h = h;


        this.r = r;


    }






    public MyHotel getHotel()
    {
        return h;
    }






    public MyRoom getRoom()
    {
        return r;
    }








    public void print()
    {
        System.out.println(h.getSerial() + " " + r.getType());
    }








}
metodo main, sezione di codice che passa i parametri da cercare al filtro di ricerca
Codice:
class findbListenerClass implements ActionListener
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                contentPanel.removeAll();

                JPanel searchPanel = new JPanel();
                //
                searchPanel.setLayout(new BorderLayout());
                //
                //
                JPanel searchConsole = new JPanel();
                //
                searchConsole.setLayout(new GridLayout(1,2));
                //
                JPanel optionsConsole = new JPanel();
                optionsConsole.setLayout(new GridLayout(3,2));
                //
                JCheckBox pricebox = new JCheckBox("Price<=");
                JTextField pricef = new JTextField();
                JCheckBox tvbox = new JCheckBox("TV");
                JCheckBox airbox = new JCheckBox("Air Conditioner");
                JCheckBox fridgebox = new JCheckBox("Fridge");
                JCheckBox netbox = new JCheckBox("Internet connection");
                //
                optionsConsole.add(pricebox);
                optionsConsole.add(pricef);
                optionsConsole.add(tvbox);
                optionsConsole.add(airbox);
                optionsConsole.add(fridgebox);
                optionsConsole.add(netbox);
                //
                //
                //
                JButton fb = new JButton("Find");
                //
                //
                searchConsole.add(optionsConsole);
                searchConsole.add(fb);
                //
                //
                JPanel foundDataPanel = new JPanel();
                //
                //
                searchPanel.add(searchConsole, BorderLayout.NORTH);
                searchPanel.add(foundDataPanel, BorderLayout.CENTER);



                contentPanel.add(searchPanel);

                f.pack();





                //listener per il pulsante di ricerca
                class fbListenerClass implements ActionListener
                {
                    @Override
                    public void actionPerformed(ActionEvent e)
                    {

                        foundDataPanel.removeAll();

                        JLabel foundData = new JLabel();
                        //label per i dati cercati

                        //check sugli elementi da cercare
                        //passare i dati da cercare al metodo di ricerca

                        //impostare il risultato della ricerca come argomento della JLabel

                        //variabili di ricerca
                        boolean findprice=false;
                        int price=0;
                        boolean findtv=false;
                        boolean findair=false;
                        boolean findfridge=false;
                        boolean findnet=false;

                        if (pricebox.isSelected())
                        {
                            findprice=true;
                            price = Integer.parseInt(pricef.getText());
                        }

                        if (tvbox.isSelected()) findtv = true;

                        if (airbox.isSelected()) findair = true;

                        if (fridgebox.isSelected()) findfridge = true;

                        if (netbox.isSelected()) findnet = true;


                        //myMap.finder(findprice, price, findtv, findair, findfridge, findnet);

                        foundData.setText(myMap.findPrintResults(findprice, price, findtv, findair, findfridge, findnet));

                        foundDataPanel.add(foundData);

                        f.pack();

                    }
                }
                ActionListener fbListener = new fbListenerClass();
                fb.addActionListener(fbListener);







            }
        }
        ActionListener findbListener = new findbListenerClass();
        findb.addActionListener(findbListener);
filtro di ricerca
Codice:
public ArrayList<FinderObj> finder(boolean findprice, int price, boolean findtv, boolean findair, boolean findfridge, boolean findnet)
    {
        ArrayList<FinderObj> results = new ArrayList<FinderObj>();


        //ottenere il keyset della mappa
        Set<MyHotel> mySet = getSet();


        //esplorare il set per ottenere la lista delle stanze per ogni hotel
        for (MyHotel hh : mySet)
        {
            //ottengo la lista delle stanze corrispondenti all'hotel hh
            RoomsList rr = theMap.get(hh);


            //scorrere la lista a caccia dei dati delle singole stanze
            //ottengo un iteratore per la lista
            RoomsListIterator myIterator = rr.listIterator();


            while (myIterator.hasNext()) //fintanto che l'iteratore rileva un'ulteriore nodo nella lista
            {


                MyRoom currentRoom = myIterator.next();


                int found = 1; //1 if found or 0 if not found
                /*
                si sfrutta la moltiplicazione di 0 e 1
                la variabile trovato inizialmente e' 1
                se la stanza corrente corrsiponde a quella cercata il moltiplicatore viene moltiplicato * 1 > ergo il risultato non cambia
                se invece la stanza corrente non rispecchia i criteri di ricerca il moltiplicatore viene moltiplicato * 0 > ergo il risultato rimarra' per sempre 0 perche'
                1*1=1 trovato
                1*0=0 non trovato
                0*1=0 trovato
                in tale modo la vriabile sara' 1 solo se tutti gli elementi sono stati trovati
                 */






                if (findprice)
                {
                    if (currentRoom.getPrice() <= price) found*=1;
                    else found*=0;
                }


                if (findtv)
                {
                    if (currentRoom.getTv()) found*=1;
                    else found*=0;
                }


                if (findair)
                {
                    if (currentRoom.getAirConditioner()) found*=1;
                    else found*=0;
                }


                if (findfridge)
                {
                    if (currentRoom.getFridge()) found*=1;
                    else found*=0;
                }


                if (findnet)
                {
                    if (currentRoom.getInternet()) found*=1;
                    else found*=0;
                }




                if (found==1)
                {
                    FinderObj foundElement = new FinderObj(hh, currentRoom);


                    results.add(foundElement); //se il risultato della ricerca e' 1 aggiungo la stanza corrente all'arraylist
                }




            }




        }


        System.out.println(results.toString()); //debug


        return results;
    }

metodo che inserisce in una stringa i risultati della ricerca, tale stringa genera una tabella in HTML

Codice:
public String findPrintResults(boolean findprice, int price, boolean findtv, boolean findair, boolean findfridge, boolean findnet)
    {


        ArrayList<FinderObj> results = finder(findprice, price, findtv, findair, findfridge, findnet);


        String stringResults = "";


        stringResults += "<html><table border\1\">";


        stringResults += "<tr><th>Room type</th><th>Available rooms</th><th>Price</th><th>TV</th><th>airCond</th><th>Fridge</th><th>Internet</th></tr>";






        //inserisco i risultati della ricerca in una stringa che formatta una tabella in html da impostare come argomento di una jlabel
        for (FinderObj fo : results)
        {
            MyRoom mr = fo.getRoom();


            stringResults += "<tr><td><b>Hotel:</b></td><td colspan=\"6\">" + fo.getHotel().getSerial() + " -- " + fo.getHotel().getName() + " -- " + fo.getHotel().getAddress() + " -- " + fo.getHotel().getCity() + " -- " + fo.getHotel().getCountry() + " -- " + fo.getHotel().getPhone() + " -- " + fo.getHotel().getFax() + "</td></tr>";


            stringResults += "<tr><td>" + mr.getType() + "</td><td>" + mr.getNum() + "</td><td>" + mr.getPrice() + "</td><td>" + mr.getTv() + "</td><td>" + mr.getAirConditioner() + "</td><td>" + mr.getFridge() + "</td><td>" + mr.getInternet() + "</td></tr>";


        }




        stringResults += "</table></html>";


        return stringResults;
    }
Il risultato è:


È corretto un filtro di ricerca implementato in questo modo?