作者 crossoverJie

:sparkles: Introducing new features.排序 Map

  1 +package com.crossoverjie.cim.common.data.construct;
  2 +
  3 +import java.util.Arrays;
  4 +import java.util.Comparator;
  5 +import java.util.SortedMap;
  6 +import java.util.TreeMap;
  7 +
  8 +/**
  9 + * Function:根据 key 排序的 Map
  10 + *
  11 + * @author crossoverJie
  12 + * Date: 2019-02-25 18:17
  13 + * @since JDK 1.8
  14 + */
  15 +public class SortArrayMap {
  16 +
  17 + private Node[] buckets;
  18 +
  19 + private static final int DEFAULT_SIZE = 10;
  20 + private int size = 0;
  21 +
  22 + public SortArrayMap() {
  23 + buckets = new Node[DEFAULT_SIZE];
  24 + }
  25 +
  26 + public void add(int key, String value) {
  27 + checkSize(size + 1);
  28 + Node node = new Node(key, value);
  29 + buckets[size++] = node;
  30 + }
  31 +
  32 + private void checkSize(int size) {
  33 + if (size >= buckets.length) {
  34 + //扩容自身的 3/2
  35 + int oldLen = buckets.length;
  36 + int newLen = oldLen + (oldLen >> 1);
  37 + buckets = Arrays.copyOf(buckets, newLen);
  38 + }
  39 + }
  40 +
  41 + public void sort(){
  42 + Arrays.sort(buckets, 0, size, new Comparator<Node>() {
  43 + @Override
  44 + public int compare(Node o1, Node o2) {
  45 + if (o1.key > o2.key){
  46 + return 1 ;
  47 + }else {
  48 + return -1;
  49 + }
  50 + }
  51 + });
  52 + }
  53 +
  54 + public void print() {
  55 + for (Node bucket : buckets) {
  56 + if (bucket == null){
  57 + continue;
  58 + }
  59 + System.out.println(bucket.toString());
  60 + }
  61 + }
  62 +
  63 + public int size() {
  64 + return size;
  65 + }
  66 +
  67 + /**
  68 + * 数据节点
  69 + */
  70 + private class Node {
  71 + public int key;
  72 + public String value;
  73 +
  74 + public Node(int key, String value) {
  75 + this.key = key;
  76 + this.value = value;
  77 + }
  78 +
  79 + @Override
  80 + public String toString() {
  81 + return "Node{" +
  82 + "key=" + key +
  83 + ", value='" + value + '\'' +
  84 + '}';
  85 + }
  86 +
  87 + }
  88 +
  89 +
  90 + public static void main(String[] args) {
  91 + TreeMap<Integer, String> addressRing = new TreeMap<Integer, String>();
  92 + for (int i = 0; i < 10; i++) {
  93 + addressRing.put(i, "192.168.1." + i);
  94 + }
  95 + Integer jobHash = 0;
  96 + SortedMap<Integer, String> lastRing = addressRing.tailMap(jobHash);
  97 + if (!lastRing.isEmpty()) {
  98 + System.out.println("result= " + lastRing.get(lastRing.firstKey()));
  99 + } else {
  100 + System.out.println("result=" + addressRing.firstEntry().getValue());
  101 + }
  102 +
  103 +
  104 + }
  105 +}
  1 +package com.crossoverjie.cim.common.data.construct;
  2 +
  3 +import org.junit.Test;
  4 +
  5 +public class SortArrayMapTest {
  6 +
  7 + @Test
  8 + public void ad() {
  9 + SortArrayMap map = new SortArrayMap() ;
  10 + for (int i = 0; i < 9; i++) {
  11 + map.add(i ,"127.0.0." + i);
  12 + }
  13 + map.print();
  14 + System.out.println(map.size());
  15 + }
  16 +
  17 + @Test
  18 + public void add() {
  19 + SortArrayMap map = new SortArrayMap() ;
  20 + for (int i = 0; i < 10; i++) {
  21 + map.add(i ,"127.0.0." + i);
  22 + }
  23 + map.print();
  24 + System.out.println(map.size());
  25 + }
  26 +
  27 + @Test
  28 + public void add2() {
  29 + SortArrayMap map = new SortArrayMap() ;
  30 + for (int i = 0; i < 20; i++) {
  31 + map.add(i ,"127.0.0." + i);
  32 + }
  33 + map.sort();
  34 + map.print();
  35 + System.out.println(map.size());
  36 + }
  37 +
  38 + @Test
  39 + public void add3() {
  40 + SortArrayMap map = new SortArrayMap() ;
  41 +
  42 + map.add(100,"127.0.0.100");
  43 + map.add(10,"127.0.0.10");
  44 + map.add(8,"127.0.0.8");
  45 + map.add(1000,"127.0.0.1000");
  46 +
  47 + map.print();
  48 + System.out.println(map.size());
  49 + }
  50 +
  51 + @Test
  52 + public void add4() {
  53 + SortArrayMap map = new SortArrayMap() ;
  54 +
  55 + map.add(100,"127.0.0.100");
  56 + map.add(10,"127.0.0.10");
  57 + map.add(8,"127.0.0.8");
  58 + map.add(1000,"127.0.0.1000");
  59 +
  60 + map.sort();
  61 + map.print();
  62 + System.out.println(map.size());
  63 + }
  64 +
  65 + int count = 1000000 ;
  66 + @Test
  67 + public void add5() {
  68 + SortArrayMap map = new SortArrayMap() ;
  69 +
  70 +
  71 + long star = System.currentTimeMillis() ;
  72 + for (int i = 0; i < count; i++) {
  73 + double d = Math.random();
  74 + int ran = (int)(d*100);
  75 + map.add(i + ran ,"127.0.0." + i);
  76 + }
  77 + map.sort();
  78 + long end = System.currentTimeMillis() ;
  79 + System.out.println("排序耗时 " + (end -star));
  80 + System.out.println(map.size());
  81 +
  82 +
  83 +
  84 + }
  85 +
  86 + @Test
  87 + public void add6(){
  88 +
  89 + SortArrayMap map = new SortArrayMap() ;
  90 + long star = System.currentTimeMillis() ;
  91 + for (int i = 0; i < count; i++) {
  92 + double d = Math.random();
  93 + int ran = (int)(d*100);
  94 + map.add(i + ran ,"127.0.0." + i);
  95 + }
  96 + long end = System.currentTimeMillis() ;
  97 + System.out.println("不排耗时 " + (end -star));
  98 + System.out.println(map.size());
  99 + }
  100 +}