Find a key by means of a binary search in byte array. - Java java.lang

Java examples for java.lang:byte Array

Description

Find a key by means of a binary search in byte array.

Demo Code

/*/*from   w ww .  jav  a  2  s. co m*/
 * DomUI Java User Interface - shared code
 * Copyright (c) 2010 by Frits Jalvingh, Itris B.V.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * See the "sponsors" file for a list of supporters.
 *
 * The latest version of DomUI and related code, support and documentation
 * can be found at http://www.domui.org/
 * The contact for the project is Frits Jalvingh <jal@etc.to>.
 */
import java.sql.*;
import java.util.*;

public class Main{
    public static void main(String[] argv) throws Exception{
        List v = java.util.Arrays.asList("asdf","java2s.com");
        int start = 2;
        byte[] key = new byte[]{34,35,36,37,37,37,67,68,69};
        System.out.println(findKey(v,start,key));
    }
    /**
     *  Find a key by means of a binary search.
     *  post: index if found, -1 if not
     *
     * @param v     vector containing the element to search for
     * @param start location where to start comparing the bytes
     * @param key   The key to look for.
     */
    public static int findKey(List<byte[]> v, int start, byte[] key) {
        byte[] ba;
        int mid, rv;
        int low, high;

        //-- Init,
        low = 0;
        high = v.size();

        //-- Loop till found.
        for (;;) {
            if (low >= high)
                return -1;

            //-- Get middle element,
            mid = (low + high) / 2;
            ba = v.get(mid); // Get middle element,
            rv = ByteArrayUtil.compare(ba, start, key.length, key); // Compare,
            if (rv == 0)
                return mid;
            if (rv < 0) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }
    }
    /**
     *   Compares a byte array part with an array.
     */
    public static int compare(byte[] a, int from, int to, byte[] b) {
        //      if(b.length != to-from) throw new IllegalArgumentException("Bad size array passed to compare.");

        int sx = 0;
        int rv = 0;
        for (int i = from; i < to; i++, sx++) {
            if (sx < b.length)
                rv = (a[i] & 0xff) - (b[sx] & 0xff);
            else
                rv = a[i];
            if (rv != 0) {
                return rv > 0 ? -1 : 1;
            }
        }
        return 0;
    }
    static public int compare(byte[] a, int astart, byte[] b, int bstart,
            int len) {
        while (len-- > 0) {
            int rv = a[astart++] - b[bstart++];
            if (rv < 0)
                return -1;
            else if (rv > 0)
                return 1;
        }
        return 0;
    }
}

Related Tutorials