Fastest way to get all values from a Map where the key starts with a certain expression

前端 未结 5 1998
不思量自难忘°
不思量自难忘° 2020-12-15 05:58

Consider you have a map myMap.

Given the expression \"some.string.*\", I have to retrieve all the values from m

5条回答
  •  情书的邮戳
    2020-12-15 06:23

    I used this code to do a speed trial:

    public class KeyFinder {
    
        private static Random random = new Random();
    
        private interface Receiver {
            void receive(String value);
        }
    
        public static void main(String[] args) {
            for (int trials = 0; trials < 10; trials++) {
                doTrial();
            }
        }
    
        private static void doTrial() {
    
            final Map map = new HashMap();
            giveRandomElements(new Receiver() {
                public void receive(String value) {
                    map.put(value, null);
                }
            }, 10000);
    
            final Set expressions = new HashSet();
            giveRandomElements(new Receiver() {
                public void receive(String value) {
                    expressions.add(value);
                }
            }, 1000);
    
            int hits = 0;
            long start = System.currentTimeMillis();
            for (String expression : expressions) {
                for (String key : map.keySet()) {
                    if (key.startsWith(expression)) {
                        hits++;
                    }
                }
            }
            long stop = System.currentTimeMillis();
            System.out.printf("Found %s hits in %s ms\n", hits, stop - start);
        }
    
        private static void giveRandomElements(Receiver receiver, int count) {
            for (int i = 0; i < count; i++) {
                String value = String.valueOf(random.nextLong());
                receiver.receive(value);
            }
    
        }
    }
    

    The output was:

    Found 0 hits in 1649 ms
    Found 0 hits in 1626 ms
    Found 0 hits in 1389 ms
    Found 0 hits in 1396 ms
    Found 0 hits in 1417 ms
    Found 0 hits in 1388 ms
    Found 0 hits in 1377 ms
    Found 0 hits in 1395 ms
    Found 0 hits in 1399 ms
    Found 0 hits in 1357 ms
    

    This counts how many of 10000 random keys start with any one of 1000 random String values (10M checks).

    So about 1.4 seconds on a simple dual core laptop; is that too slow for you?

提交回复
热议问题