public static List <Record> sortip(List <Record> recordList){
compareip comparator=new compareip();
Collections.sort(recordList, comparator);
return recordList;
}调用接口为
class compareipimplements Comparator{
public int compare(Object arg0, Object arg1) {
Record user0=(Record)arg0;
Record user1=(Record)arg1;
  return user0.getip().compareTo(user1.getip());
}   
}1程序执行没有错误 瞎奶有个 字段是ip地址  (如12。121。233。2)
等。 发现compareTo没有能力对 ip字段进行排序。  
现在如何修改代码才鞥让ip字段的 list 排序??
2另外有个字段是 phone 
表里这个字段值不规范 如
+1232323213
+9231235454
809002
+34324234

还有很多空值
compareto也没偶能力为这个字段进行排序
(我的想法先判度是否有+ 如果有去掉
号码大小来排序)

解决方案 »

  1.   


    import java.util.Comparator;
    public class Record  implements Comparator<Record>{
    private String ip;
    public Record(String ip){
    this.ip=ip;
    }
    public int compare(Record ra, Record rb) {
    int raIp=Integer.parseInt(ra.ip.split("\\.")[0]);
    int rbIp=Integer.parseInt(rb.ip.split("\\.")[0]);
    return raIp>rbIp?1:(ra.ip.equals(rb.ip)?1:-1);
    }
    public String getIp(){
    return this.ip;
    }
    }
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import com.state.cn.Record;
    public class Test {
    public static void main(String[] args){
    List<Record> list=new ArrayList<Record>();
    list.add(new Record("192.168.2.254"));
    list.add(new Record("172.168.2.254"));
    list.add(new Record("123.168.2.254"));
    list.add(new Record("91.168.2.254"));
    list.add(new Record("27.168.2.254"));
    list.add(new Record("36.168.2.254"));
    list.add(new Record("54.168.2.254"));
    Collections.sort(list,new Comparator<Record>(){
    public int compare(Record ra, Record rb) {
    int raIp=Integer.parseInt(ra.getIp().split("\\.")[0]);
    int rbIp=Integer.parseInt(rb.getIp().split("\\.")[0]);
    return raIp>rbIp?1:(ra.getIp().equals(rb.getIp())?1:-1);
    }
    });
    for(Record r:list)
    System.out.println(r.getIp());
    }
    }
      

  2.   

    当然Record类中没有必要实现接口了,我写在test类中了public class Record{
    private String ip;
    public Record(String ip){
    this.ip=ip;
    }
    public String getIp(){
    return this.ip;
    }
    }
      

  3.   

    getip()获取的数据是什么格式的?
    我建议把ip存成整数排序会更好看一些
      

  4.   

    感谢 closewbq
    第2个问题 2另外有个字段是 phone 
    表里这个字段值不规范 如 
    +1232323213 
    +9231235454 
    809002 
    +34324234 
    。 
    还有很多空值 
    compareto也没偶能力为这个字段进行排序 
    (我的想法先判度是否有+ 如果有去掉 
    号码大小来排序) 
    ------------有人建议用正则表达式做 (从字符串中数字开头的地方取数字
    如 pattern.compile  (+(\\d))?? 不知道如何写这个 并应用
      

  5.   

     Collections.sort(list,new Comparator<Record>(){
                public int compare(Record ra, Record rb) {
                    int raIp=Integer.parseInt(ra.getIp().split("\\.")[0]);
                    int rbIp=Integer.parseInt(rb.getIp().split("\\.")[0]);
                    return raIp>rbIp?1:(ra.getIp().equals(rb.getIp())?1:-1);
                }
            });这只是比较每个IP的第一个字节比如我输入input 
    list.add(new Record("1","1","1","1","1","1","1","1","1","192.168.2.254"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","192.168.2.25"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","123.168.2.254"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","91.168.2.254"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","192.168.112.25"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","36.168.2.254"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","54.168.2.254"));my结果
    36.168.2.254
    54.168.2.254
    91.168.2.254
    123.168.2.254
    192.168.2.254
    192.168.2.25
    192.168.112.25实际上第2个 第3 第4都需要判断的 
    比如
    192.168.2.25
    应该在192.168.2.254
    的前面
    192.168.112.25
    应该在192的最前面
    36.168.2.254
    54.168.2.254
    91.168.2.254
    192.168.112.25
    192.168.2.25
    123.168.2.254
    192.168.2.254
    请问代码如何再改写哦
      

  6.   

    private static long ipToLong(String strIP)    {
             int j=0;
             int i=0;
             long [] ip=new long[4];
             int position1=strIP.indexOf(".");
             int position2=strIP.indexOf(".",position1+1);
             int position3=strIP.indexOf(".",position2+1);  
             ip[0]=Long.parseLong(strIP.substring(0,position1));
             ip[1]=Long.parseLong(strIP.substring(position1+1,position2));
             ip[2]=Long.parseLong(strIP.substring(position2+1,position3));
             ip[3]=Long.parseLong(strIP.substring(position3+1));
             return (ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3]; //ip1*256*256*256+ip2*256*256+ip3*256+ip4
        } public static void main(String[] args) throws Exception {
    List<Record> list=new ArrayList<Record>();
            list.add(new Record("1","1","1","1","1","1","1","1","1","192.168.2.254"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","192.168.2.25"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","123.168.2.254"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","91.168.2.254"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","192.168.112.25"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","36.168.2.254"));
            list.add(new Record("1","1","1","1","1","1","1","1","1","54.168.2.254"));
            Collections.sort(list,new Comparator<Record>(){
                public int compare(Record ra, Record rb) {
                   // if   ((startDate==null)   ||   (startDate.equals("")))  
                
                 //int raIp=Integer.parseInt(ra.getIpStr().split("\\.")[0]);
                    //int rbIp=Integer.parseInt(rb.getIpStr().split("\\.")[0]);
                 long a;
                 long b;            
                 a=ipToLong(ra.getIpStr());
                 b=ipToLong(rb.getIpStr());
                    return a>b?1:-1;
                 //if(a>b)
      

  7.   

    int rbIp=Integer.parseInt(rb.getIpStr().split("\\.")[0]); 
    这个仅仅比较了第1个int只是还不是很理想的那种,需要4个int都进行比较的那种如何写?