Avatar billede badal Nybegynder
18. oktober 2003 - 18:09 Der er 9 kommentarer og
1 løsning

Søgning i vektorer

Nogle uddrag fra koden kan ses forneden. jeg opretter i min ServerImpl.java fil (Se længere nede) en objekt af typen Viewcommand
og lægger den ned i en vector. Nu ønsker jeg at finde en bestemt objekt frem. Dertil
bruger jeg equals funktionen i ViewCommand hvor jeg opstiller en række betingelser.
Hvis der findes en objekt så retuneres den. Se funktionerne:
I klassen ServerImpl
public ViewCommand ViewCommandObjS()
public void All()
og public boolean equals(Object obj) i funktionen.

Jeg opretter et nyt viewcommand objekt som indeholder fire søgekritere.  Problemet er så
at en statement som skal være den samme hele tiden det bliver der ikke søgt på.
Feks. (IntLevel!=2). Se Equals funktion.

NOgen der har et bud hvad der kan være galt og hvis der findes en anden og bedre måde at
søge efter et objekt på i en vektor må der gerne gives nogle kode eksempler på det.

import java.util.*;
import java.io.Serializable;
import java.lang.Object;
import java.sql.*;

public class ViewCommand implements Serializable
{
   
    ///////////////////////////////////////////////////////////////////
    /// v_command (Variables)
    ///////////////////////////////////////////////////////////////////
      int IntCustomer_id;
      int IntCommand_id1;
      int IntCommand_id2;
      String StrCommand_code1;
      String StrCommand_code2;
      String StrPort;
      String StrSender;
      String StrLac;
      int IntAction_number;
      String StrAction_name;
      int IntProgram_id;
      String StrProgram_name;
      int IntLevel;
      String StrParm1;
      String StrParm2;
     
      ///////////////////////////////////////////////////////////////////
    /// Default constructor. Starts the thread. 
    ///////////////////////////////////////////////////////////////////
     
      public ViewCommand()
    {
   
    }

    ///////////////////////////////////////////////////////////////////
    /// Constructor. Opretter en v_command objekt. 
    ///////////////////////////////////////////////////////////////////

      public ViewCommand
          (   
              int IntCustomer_id,
              int IntCommand_id1,
              int IntCommand_id2,
              String StrCommand_code1,
              String StrCommand_code2,
              String StrPort,
              String StrSender,
              String StrLac,
              int IntAction_number,
              String StrAction_name,
              int IntProgram_id,
              String StrProgram_name,
              int IntLevel,
              String StrParm1,
              String StrParm2
             
          )
      {
        this.IntCustomer_id = IntCustomer_id;
          this.IntCommand_id1  = IntCommand_id1;
          this.IntCommand_id2  = IntCommand_id2;
          this.StrCommand_code1 = StrCommand_code1;
          this.StrCommand_code2 = StrCommand_code2;
          this.StrPort = StrPort;
          this.StrSender  = StrSender;
          this.StrLac = StrLac;
          this.IntAction_number = IntAction_number;
          this.StrAction_name = StrAction_name;
          this.IntProgram_id = IntProgram_id;
          this.StrProgram_name  = StrProgram_name;
          this.IntLevel = IntLevel;
          this.StrParm1 = StrParm1;
          this.StrParm2 = StrParm2;
      }
     
   
    ///////////////////////////////////////////////////////////////////
    /// Konstruktør som benyttes til at oprette søge objekt med
    ///////////////////////////////////////////////////////////////////
    public ViewCommand(String StrCommand_code1, String StrCommand_code2 , String StrSender, String StrLac )
    {
        this.StrCommand_code1 = StrCommand_code1;
        this.StrCommand_code2 = StrCommand_code2;
        this.StrSender = StrSender;
        this.StrLac = StrLac;
    }
   
    ///////////////////////////////////////////////////////////////////
    /// Søger objektet. Funktion benyttes sammen indexof funktionen
    ///////////////////////////////////////////////////////////////////
   
    public boolean equals(Object obj)
    {   
        if (obj instanceof ViewCommand)
        {
              ViewCommand comp = (ViewCommand) obj;
             
              if(
                  ///*Problem*/(!(IntLevel != 2))
                  //&&
            // StrCommand_code1 !=null kan den hellere ikke lide. OG hellere ikk StrCommand_code2 sammenlignes med StrCommand_code1
                  ///*Problem*/( (StrCommand_code1 !=null) && (!StrCommand_code2.equalsIgnoreCase(comp.StrCommand_code1)) )
                  //||
            // Men tilgengælder virker den her fint. Tror det er fordi at der "sammenlignes" rigtigt.
            // Det vil sige at StrCommand_code1 med comp.StrCommand_code
                  ///*Virker*/(!StrCommand_code1.equalsIgnoreCase(comp.StrCommand_code1))
                  //&&
                  ///*Virker*/(!StrCommand_code2.equalsIgnoreCase(comp.StrCommand_code2) )
                )
              return false;
        }
        else
        {
              return false;
        }
    return true;
  }

   
   
///////////////////////////////////////////////////////////////////
/// Get metoder
///////////////////////////////////////////////////////////////////
 
    public ViewCommand getViewCommandObj(int index, Vector v) // Retunere en enkelt view command objekt. Som der er blevet søgt på.
      {
          return (ViewCommand)v.get(index);
      }
 
     
     
}
/////////SERVERIMPL.java//////////////////////////////////////////////////////
import java.rmi.*;
import java.rmi.server.*;
import java.util.Date;
import java.util.*;
import java.sql.*;
import java.lang.Object;
import java.io.Serializable;


public class ServerImpl extends UnicastRemoteObject implements Server, Runnable, Serializable
{
    private Connection conn = null;
      private Statement stmt= null;
     
      private Vector all = new Vector();
     
      ReadFromXML RFX = new ReadFromXML();

      private String databaseName;
      private String databaseForname;
      private String username;
    private String password;
    private int thread1;
       
    public ServerImpl () throws RemoteException
    {
        Thread t = new Thread(this);
        t.start();
        databaseName = RFX.GetDatabaseName();
        databaseForname = RFX.GetDatabaseForname();
        username = RFX.GetUsername();
        password = RFX.GetPassword();
        thread1 = RFX.GetThread1SleepTime();
    }
   
    public void ConnectToDatabase()
    {
        try
          {
              Class.forName(databaseForname);
            conn= DriverManager.getConnection (databaseName, "", "");
            stmt = conn.createStatement();
        }
        catch (Exception ex){System.out.println("Exception in ConnectToDatabase() in class ServerImpl: " + ex);}   
    }
   
    public Vector getAll()
      {
          return all;
      }
     
      public void All()
    {
        ConnectToDatabase();
       
        try
        {
            ResultSet rs = stmt.executeQuery("SELECT       IntCustomer_id, IntCommand_id1,  IntCommand_id2,      StrCommand_code1,      StrCommand_code2,    StrPort,            StrSender,          StrLac,          IntAction_number,    StrAction_name,  IntProgram_id,        StrProgram_name,    IntLevel,        StrParm1,            StrParm2 FROM V_commands");
       
            while (rs.next())
            {
                  ViewCommand viewcommand = new ViewCommand( rs.getInt(1),  rs.getInt(2),    rs.getInt(3),        rs.getString(4),      rs.getString(5),    rs.getString(6),    rs.getString(7),    rs.getString(8),  rs.getInt(9),      rs.getString(10),  rs.getInt(11),      rs.getString(12),    rs.getInt(13),  rs.getString(14),    rs.getString(15)      );
                  all.addElement(viewcommand);
            }
           
        }
        catch (Exception ex)
        {
            System.out.println("Exception in run() method in class ServerImpl: " + ex);
        }
        finally
        {
       
            DisconnectFromDatabase();
           
        }
    }
   
    public void DisconnectFromDatabase()
    {
        try
        {
            stmt.close();
            conn.close();
        }
        catch (Exception ex)
        {
            System.out.println("Exception in CloseDatabase() in class ServerImpl: " + ex);
        }
    } 

    public void empyVector()
    {
        all.clear();
    }
   
   
    public Date getDate ()  throws RemoteException
    {
        return new Date ();
    }
   
   
    //public ViewCommand(String StrCommand_code1, String StrCommand_code2 , String StrSender, String StrReceiver )
    public ViewCommand ViewCommandObjS() throws RemoteException
    {
        ViewCommand viewcommand = new ViewCommand();
        ViewCommand vcom = new ViewCommand();
         

          synchronized(all)
          {
              Vector  v = getAll();
              ViewCommand k = new ViewCommand("code1", "code2", "Sender12", "Receiver13");
            int n = v.indexOf(k);
            System.out.println(n);
            if(n>=0)
            {
                vcom = viewcommand.getViewCommandObj(n,v);   
            }
        }
        return vcom;
    }
   
    public void run()
    {
        while(true)
        {
               
            synchronized(all)
            {
                empyVector();
                All();
                System.out.println("Vector updated");   
            }
           
            try
            {
                Thread.sleep(thread1);
            }
            catch (Exception ex)
            {}
        }
    }
   
}
Avatar billede arne_v Ekspert
18. oktober 2003 - 19:11 #1
Dem du siger ikke virker - hvordan fejler de ?
Avatar billede arne_v Ekspert
18. oktober 2003 - 19:13 #2
Generelt vil jeg sige at equals burde sammenligne alle relevante
felter og kun returnere true hvis alle relevante felter er ens.

Det ligger man normalt i equals.

Hvis du vil lede efter noget udfra et kriterie bør du lave en
speciel metode (og formentlig wrappe Vector i en klasse).
Avatar billede arne_v Ekspert
18. oktober 2003 - 20:04 #3
Eksempel:

Item.java
---------

public class Item {
    private int ival;
    private String sval;
    public Item() {
        this(0, "");
    }
    public Item(int ival, String sval) {
        this.ival = ival;
        this.sval = sval;
    }
    public int getIval() {
        return ival;
    }
    public String getSval() {
        return sval;
    }
    public void setIval(int i) {
        ival = i;
    }
    public void setSval(String string) {
        sval = string;
    }
    public boolean equals(Object o) {
        if(o instanceof Item) {
            Item oitem = (Item)o;
            if((ival==oitem.ival) && (sval.equals(oitem.sval))) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    public int hashCode() {
        return (sval.hashCode() + ival);
    }
    public String toString() {
        return ("[" + ival + "," + sval + "]");
    }
}

ItemList.java
-------------

import java.util.Vector;

public class ItemList {
    private Vector list;
    public ItemList() {
        list = new Vector();
    }
    public void add(Item it) {
        list.add(it);
    }
    public Item get(int ix) {
        return (Item)list.get(ix);
    }
    public boolean contains(Item it) {
        return (list.indexOf(it) >= 0);
    }
    public boolean containsIval(int ival) {
        for(int i = 0; i < list.size(); i++) {
            if(get(i).getIval()==ival) {
                return true;
            }
        }
        return false;
    }
    public boolean containsSval(String sval) {
        for(int i = 0; i < list.size(); i++) {
            if(get(i).getSval().equals(sval)) {
                return true;
            }
        }
        return false;
    }
    public Vector findByIval(int ival) {
        Vector res = new Vector();
        for(int i = 0; i < list.size(); i++) {
            if(get(i).getIval()==ival) {
                res.add(get(i));
            }
        }
        return res;
    }
    public Vector findBySval(String sval) {
        Vector res = new Vector();
        for(int i = 0; i < list.size(); i++) {
            if(get(i).getSval().equals(sval)) {
                res.add(get(i));
            }
        }
        return res;
    }
    public String toString() {
        return list.toString();
    }
}

TestItem.java
-------------

public class TestItem {
    public static void main(String[] args) {
        ItemList list = new ItemList();
        list.add(new Item(1, "a"));
        list.add(new Item(2, "bb"));
        list.add(new Item(3, "ccc"));
        System.out.println(list);
        System.out.println(list.contains(new Item(2, "bb")));
        System.out.println(list.contains(new Item(4, "dddd")));
        System.out.println(list.containsIval(2));
        System.out.println(list.containsIval(4));
        System.out.println(list.findByIval(2));
        System.out.println(list.findByIval(4));
    }
}
Avatar billede badal Nybegynder
18. oktober 2003 - 22:19 #4
Hej Arne,
Den løsning forslag som du kom med virker meget fornuftigt, men hvis jeg skal implementer det i min kode så skal jeg ændre for meget. Jeg vil helst have lagt søgt kreterierne i min equal funktion i viewcommand funktion.
Jeg har zippet de to ovenstående filer plus en test database så man lige kan se det. Her er adressen: http://www.itdiplom.net/work.zip
Avatar billede arne_v Ekspert
18. oktober 2003 - 22:28 #5
Jeg forstå ikke helt din logik:

              if(
                  (!(IntLevel != 2)) // skal finde finde kunden customer_id = 785 i databasen
                )
              return false;

785 har IntLevel=2

Og derfor returnerer den false.

Og så kan equals jo ikke finde den.

Har jeg misset noget ?
Avatar billede badal Nybegynder
18. oktober 2003 - 22:49 #6
Det var også en lidt kryptisk måde jeg havde skrevet den på. Nu har jeg lavet den lidt om men det virker hellere ikke.

public boolean equals(Object obj)
{   
  if (obj instanceof ViewCommand)
  {
    ViewCommand comp = (ViewCommand) obj;
             
    if(
      (IntLevel == 2) // skal finde finde kunden customer_id = 785 i databasen
      )
      return true;
      else return false;
      }
      else
        {
              return false;
      }
}
Avatar billede arne_v Ekspert
18. oktober 2003 - 23:08 #7
Mystisk - det burde nemlig "virke".
Avatar billede badal Nybegynder
18. oktober 2003 - 23:14 #8
Det er nemlig det for det ser "rigtigt" men alligevel virker det ikke. Det vil bare ikke virke
Avatar billede badal Nybegynder
19. oktober 2003 - 00:08 #9
Hvis jeg opretter en søge objekt som denne:
ViewCommand(String StrCommand_code1, String StrCommand_code2 , String StrSender, String StrLac, int IntLevel )
hvor jeg sætter IntLevel=2
og ændre equal til følgende:
if(
  (IntLevel == comp.IntLevel)
  )
{
  return true;
}

Så virker koden. Men jeg forstår stadig ikke hvorfor den ikke kan lide IntLevel=2.
Avatar billede badal Nybegynder
19. maj 2004 - 18:50 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester