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 Viewcommandog 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)
{}
}
}
}
