正在显示
2 个修改的文件
包含
205 行增加
和
0 行删除
| 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 | +} |
cim-common/src/test/java/com/crossoverjie/cim/common/data/construct/SortArrayMapTest.java
0 → 100644
| 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 | +} |
-
请 注册 或 登录 后发表评论