Re: using TreeMap how to return the Object ?
moonhkt wrote:
How to using searchKey return object eleHost values?
Since Jeff addressed your primary question, I'll add secondary points.
cat eleHost.java
Follow the Java naming conventions!
Types begin with an upper-case letter.
public class eleHost {
String ip;
Why not 'private'?
Why not 'final'?
String host1;
Where are your Javadoc comments?
public eleHost (String a, String b) {
this.ip = a;
this.host1 = b;
}
/* public String toString () {
return ip + "|" + host1;
} */
}
You need to override 'equals()' and 'hashCode()' in 'eleHost' (and of course, rename the type).
'equals()' and 'hashCode()' must always be consistent, and overridden together or not at all.
'toString()' should use at least the fields used for 'equals()' and 'hashCode()'.
If the type implements 'Comparable', you also need to override 'compareTo()' and make it consistent with 'equals()' and 'hashCode()'.
You need to override these methods if you wish comparisons and ordering in your 'TreeMap()' to work
correctly.
To use 'TreeMap', the base type must either be 'Comparable' or have an associated 'Comparator'
passed to the map.
cat clsHosts.java
import java.io.*;
Eschew import-on-demand.
Use single-type imports.
import java.util.*;
import java.util.regex.*;
import java.lang.String.*;
import java.text.*;
public class clsHosts {
Naming conventions.
Why do you put 'cls' into the name? it contributes nothing.
// Instance Variables
Don't use pointless comments.
// http://kerflyn.wordpress.com/2011/05/20/how-treemap-can-save-your-day/
TreeMap ipx = new TreeMap () ; /* a sorted and navigable map */
DO NOT USE RAW TYPES!
Don't use pointless comments.
Do use better variable names. 'ipx' reveals nothing.
String ifn = "/etc/hosts" ;
You might want to make this a 'static final String' (compile-time constant variable).
// Constructor
Another pointless comment. Use Javadoc comments!
Why did you even declare this constructor?
public clsHosts () {
}
// Methods
Pointless comment.
public void process_hosts () {
Follow the Java naming conventions. Use camel case for most identifiers, no underscores.
File ihost = new File(ifn);
String delimscfg = "\\s+"; /** multi-space */
Use camel case!
String aline ;
int i = 0 ;
try {
BufferedReader br1 = new BufferedReader(new FileReader(ihost));
while ((aline = br1.readLine()) != null) {
String [] tokens = aline.split(delimscfg);
try {
if ( ! tokens[0].trim().startsWith("#")) {
What if 'tokens' has no elements or is 'null'?
It is not an exception, so don't use exception handling for it.
/* System.out.print("-->");
Don't use 'System.out' for debugging or logging.
System.out.print(tokens[0].trim());
System.out.print(" ");
System.out.print(tokens[0].trim().substring(0));
System.out.println("<--"); */
ipx.put(tokens[0].trim(),new eleHost(tokens[1].trim(),"x"));
}
} catch (ArrayIndexOutOfBoundsException e) {
Don't use exceptions for if-then tests. Don't ignore exceptions.
continue;
}
}
} catch (IOException e) {
System.out.println(e);
Handle exceptions, don't drop them.
'System.out' is not an 'err' stream.
}
}
/* Print all data */
That should be a Javadoc comment!
Make sure your Javadoc comments *exist* and are *complete*.
public void printAll () {
Set set = ipx.entrySet();
Iterator i = set.iterator();
Don't use an explicit iterator.
Don't use single-letter variable names.
while(i.hasNext()) {
Just use a for loop. A for-each loop will work.
Map.Entry me = (Map.Entry) i.next();
DO NOT USE RAW TYPES!
That cast were utterly unnecessary had you not done so.
System.out.printf("%-18s %-25s\n" , me.getKey() , me.getValue());
}
}
/* get Hostname by IP address */
public String getHost (String ip) {
Set set = ipx.entrySet ();
Read the ** manual on how to use maps.
Don't use the entry set. Do not use the iterator. Use the freaking 'get' method.
Seriously, you are looping through a map to get the associated value for a key?
Seriously?
Surely you jest.
Iterator i = set.iterator ();
It is unusual and probably undesirable to insert a space between method name and parentheses.
while (i.hasNext()) {
Map.Entry me = (Map.Entry) i.next ();
if (me.getKey().equals(ip)) {
return me.getValue().toString();
}
}
return null;
}
If you're going to do this anyway, do not use a map.
public void searchKey (String ip) {
What if 'ip' is 'null'?
System.out.println( ipx.get(ip));
If you have this, why the loop method?
}
}
cat getip.java
class getip {
Naming conventions.
Why not 'public'?
public static void main (String args[]) throws Exception {
clsHosts v = new clsHosts();
String rtn ;
v.process_hosts();
v.printAll();
rtn = v.getHost("21xxxxxxx");
System.out.println("rtn=" + rtn);
v.searchKey("21xxxxxxx");
}
}
--
Lew