почему HashSet, созданный из redis zset, сохраняет сортировку? - PullRequest
0 голосов
/ 09 апреля 2019

В Java HashSet не сортируется, как показано ниже:

        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(4);
        set.add(3);
        set.add(2);
        set.add(5);
        set.forEach(e-> System.out.print(e+" "));

его вывод:

1 2 3 4 5

Когда набор java исходит из zset, например:

redisTemplate.opsForZSet().add(key, 1, 0);
redisTemplate.opsForZSet().add(key, 4, 1);
redisTemplate.opsForZSet().add(key, 3, 2);
redisTemplate.opsForZSet().add(key, 2, 3);
redisTemplate.opsForZSet().add(key, 5, 4);
Set<Integer> set = redisTemplate.opsForZSet().range(key, 0, -1);
System.out.println(set.getClass());
set.forEach(e-> System.out.print(e+" "));

Вывод:

java.util.HashSet
1 4 3 2 5

Почему в это время вывод сохраняет порядок как ввод?

1 Ответ

0 голосов
/ 09 апреля 2019

ZSET упорядочен по счету, а не по ключу членов в ZSET.Итак, в вашем примере:

redisTemplate.opsForZSet().add(key, 1, 0);
redisTemplate.opsForZSet().add(key, 4, 1);
redisTemplate.opsForZSet().add(key, 3, 2);
redisTemplate.opsForZSet().add(key, 2, 3);
redisTemplate.opsForZSet().add(key, 5, 4);

1 имеет оценку 0, а 5 имеет оценку 4.Если вы изменили это на:

redisTemplate.opsForZSet().add(key, 1, 1);
redisTemplate.opsForZSet().add(key, 4, 4);
redisTemplate.opsForZSet().add(key, 3, 3);
redisTemplate.opsForZSet().add(key, 2, 2);
redisTemplate.opsForZSet().add(key, 5, 5);

Вы должны получить ожидаемый результат.

...