help me plz i need to sort ip address, am try to sort
in java.util.Arrays.sort() but it not correct for eg

String st[]={"10.4.23.16","10.4.23.9"};
java.util.Arrays.sort(st);
for(int i=0;i<st.length;i++){
System.out.println(st[i]);
}

the out put is
10.4.23.16
10.4.23.9
plz give idea

Recommended Answers

All 8 Replies

Yes. Write a Comparator. (see the API docs for Comparator and the Collections Tutorials)

help me plz i need to sort ip address, am try to sort
in java.util.Arrays.sort() but it not correct for eg

String st[]={"10.4.23.16","10.4.23.9"};
java.util.Arrays.sort(st);
for(int i=0;i<st.length;i++){
System.out.println(st[i]);
}

the out put is
10.4.23.16
10.4.23.9
plz give idea

The Algo which you a using will sort the string array. For comparing strings it will compare each compare starting from 1st character. Now for the eg given both string are same until 8 characters(start counting from 1), i.e '.' . Now for second IP 9th character is 9 and for 1st IP its 1 so as 9 is bigger the bigger number is at the bottom of list.
So if you want to still use this algo u can stuff your IPaddress with extra zeros, such that their three digits after each '.'
Or you can construct your own comparator which will separate the all the no after "." then compare all the nos accordingly.

help me plz i need to sort ip address, am try to sort
in java.util.Arrays.sort() but it not correct for eg

String st[]={"10.4.23.16","10.4.23.9"};
java.util.Arrays.sort(st);
for(int i=0;i<st.length;i++){
System.out.println(st[i]);
}

the out put is
10.4.23.16
10.4.23.9
plz give idea

10q for ur replies i will try to make my own comparator.

Take a look at the InetAddress class. You can use it to parse your text into an internal-form inet address
InetAddress.getByName("10.4.23.16")
then extract it as a byte array
byte[] bytes = InetAddress.getByName("10.4.23.16").getAddress();
It will then be easy to write the comparator using those four numeric bytes (four nested tests OR bit-shift them into a single int and compare that).

You cannot use util.sort because the string is an ip and sorting wont be right as it is not a string.
Here is a code I've used to sort ip address properly. I've used StringTokenizer to break down the ip address and store it in a two dimensional array. Then i used a modified bubble sort algorithm to sort the ip address

import java.util.StringTokenizer;
public class IPsort {
	public static void main(String[] args) {
	String ipstring[]={"10.4.23.16","10.4.23.9","255.255.255.0","10.40.23.16","11.4.23.16","243.255.255.1"};
	String [] SortedIp = new String[ipstring.length];
	int [][] a = new int[ipstring.length][4];
		for(int cntr =0;cntr<ipstring.length;cntr++){
			StringTokenizer st1 = new StringTokenizer(ipstring[cntr], ".");
			//iterate through tokens
			int i = 0;
			while(st1.hasMoreTokens()){
				a[cntr][i] = Integer.parseInt(st1.nextToken());
				i++;
			}
		}  
					int pass, in, temp;
					for (pass=1; pass < ipstring.length; pass++) { // count how many times
					//System.out.println("pass : " + pass);
						// This next loop becomes shorter and shorter
						for (in=0; in < (ipstring.length) - pass; in++) {
						//System.out.println("in value is : " +in);
							if(a[in][0] > a[in+1][0])    // out of order?
							{
								temp = a[in][0];
								a[in][0] = a[in+1][0];
								a[in+1][0] = temp;
								//swap(in, in+1);     // swap them
								temp = a[in][1];
								a[in][1] = a[in+1][1];
								a[in+1][1] = temp;
								//swap(in, in+1);     // swap them
								temp = a[in][2];
								a[in][2] = a[in+1][2];
								a[in+1][2] = temp;
								//swap(in, in+1);     // swap them
								//swap(in, in+1);     // swap them
								temp = a[in][3];
								a[in][3] = a[in+1][3];
								a[in+1][3] = temp;
								//swap(in, in+1);     // swap them
							}
							if(a[in][0] == a[in+1][0])
							{
								if(a[in][1] > a[in+1][1])    // out of order?
								{
									temp = a[in][0];
									a[in][0] = a[in+1][0];
									a[in+1][0] = temp;
									//swap(in, in+1);     // swap them
									temp = a[in][1];
									a[in][1] = a[in+1][1];
									a[in+1][1] = temp;
									//swap(in, in+1);     // swap them
									temp = a[in][2];
									a[in][2] = a[in+1][2];
									a[in+1][2] = temp;
									//swap(in, in+1);     // swap them
									//swap(in, in+1);     // swap them
									temp = a[in][3];
									a[in][3] = a[in+1][3];
									a[in+1][3] = temp;
									//swap(in, in+1);     // swap them
								}
								if(a[in][1] == a[in+1][1])    // out of order?
								{
									if(a[in][2] > a[in+1][2])
									{
										temp = a[in][0];
										a[in][0] = a[in+1][0];
										a[in+1][0] = temp;
										//swap(in, in+1);     // swap them
										temp = a[in][1];
										a[in][1] = a[in+1][1];
										a[in+1][1] = temp;
										//swap(in, in+1);     // swap them
										temp = a[in][2];
										a[in][2] = a[in+1][2];
										a[in+1][2] = temp;
										//swap(in, in+1);     // swap them
										//swap(in, in+1);     // swap them
										temp = a[in][3];
										a[in][3] = a[in+1][3];
										a[in+1][3] = temp;
										//swap(in, in+1);     // swap them
									}
									if(a[in][2] == a[in+1][2])
									{
										if(a[in][3] > a[in+1][3])
										{
											temp = a[in][0];
											a[in][0] = a[in+1][0];
											a[in+1][0] = temp;
											//swap(in, in+1);     // swap them
											temp = a[in][1];
											a[in][1] = a[in+1][1];
											a[in+1][1] = temp;
											//swap(in, in+1);     // swap them
											temp = a[in][2];
											a[in][2] = a[in+1][2];
											a[in+1][2] = temp;
											//swap(in, in+1);     // swap them
											//swap(in, in+1);     // swap them
											temp = a[in][3];
											a[in][3] = a[in+1][3];
											a[in+1][3] = temp;
											//swap(in, in+1);     // swap them
										}
									}
									
								}
							}
						}
					}
				for(int cntr = 0; cntr<ipstring.length;cntr++)
				{
					for(int i=0;i<4;i++)
					{
						if(i==0){
							SortedIp[cntr] = Integer.toString(a[cntr][i]);
						}
						else{
							SortedIp[cntr] = SortedIp[cntr] +"." +Integer.toString(a[cntr][i]);
						}
					}
				}
				for (int cntr = 0; cntr<ipstring.length;cntr++)
				{
					System.out.println("Ip's given :-"+ ipstring[cntr]);
				}
				for (int cntr = 0; cntr<ipstring.length;cntr++)
				{
					System.out.println("Ip sorted is :-"+ SortedIp[cntr]);
				}
	}
}

OUTPUT :
Ip's given :-10.4.23.16
Ip's given :-10.4.23.9
Ip's given :-255.255.255.0
Ip's given :-10.40.23.16
Ip's given :-11.4.23.16
Ip's given :-243.255.255.1
Ip sorted is :-10.4.23.9
Ip sorted is :-10.4.23.16
Ip sorted is :-10.40.23.16
Ip sorted is :-11.4.23.16
Ip sorted is :-243.255.255.1
Ip sorted is :-255.255.255.0

:sigh:

I have sort ip addressess
input like this-
19.19.18.0/24
19.19.19.0/24
18.0.0.0/8
198.19.0.0/16
198.19.19.0/24
199.19.19.0/24

want output like
18.0.0.0/8
198.19.0.0/16
198.19.19.0/24
199.19.19.0/24
19.19.18.0/24
19.19.19.0/24

i used this but not working properly

public int compare(WSAPolicy NwsaPolicy1, WSAPolicy NwsaPolicy2) 
    {
        byte[] ba1 = NwsaPolicy1.getIdentity().getName().trim().getBytes();
        byte[] ba2 = NwsaPolicy2.getIdentity().getName().trim().getBytes();

        if(ba1.length < ba2.length) return -1;
        if(ba1.length > ba2.length) return 1;

        for(int i = 0; i < ba1.length; i++) {
            int b1 = unsignedByteToInt(ba1[i]);
            int b2 = unsignedByteToInt(ba2[i]);
            if(b1 == b2)
                continue;
            if(b1 < b2)
                return 1;
            else
                return -1;
        }
        return 0;
    }
    private int unsignedByteToInt(byte b) {
        return (int) b & 0xFF;
    }
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.