问题描述
# compl1.rb - Redis autocomplete example# download female-names.txt from http://antirez.com/misc/female-names.txtrequire 'rubygems'require 'redis'r = Redis.new# Create the completion sorted setif !r.exists(:compl) puts "Loading entries in the Redis DBn" File.new('female-names.txt').each_line{|n| n.strip! (1..(n.length)).each{|l| prefix = n[0...l] r.zadd(:compl,0,prefix) } r.zadd(:compl,0,n+"*") }else puts "NOT loading entries, there is already a 'compl' keyn"end# Complete the string "mar"def complete(r,prefix,count) results = [] rangelen = 50 # This is not random, try to get replies < MTU size start = r.zrank(:compl,prefix) return [] if !start while results.length != count range = r.zrange(:compl,start,start+rangelen-1) start += rangelen break if !range or range.length == 0 range.each {|entry| minlen = [entry.length,prefix.length].min if entry[0...minlen] != prefix[0...minlen] count = results.count break end if entry[-1..-1] == "*" and results.length != count results << entry[0...-1] end } end return resultsendcomplete(r,"marcell",50).each{|res| puts res}
解决方案
[/package nosql;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashSet;import java.util.Iterator;import java.util.Set;import redis.clients.jedis.Jedis;public class RedisDemo {private final static String COMPLETE_KEY = "compl";private final static Jedis jedis = new Jedis("192.168.118.2");public static void main(String[] args) throws Exception {if(jedis.exists(COMPLETE_KEY)) {System.err.println("NOT loading entries, there is already a '" + COMPLETE_KEY + "' keyn");} else {setupCompletedSet();}Set<String> set = complete("ma" , 50);for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) {System.out.println(iterator.next());}}private static void setupCompletedSet() throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(RedisDemo.class.getResourceAsStream("female-names.txt")));String line = null;while((line = br.readLine()) != null) {for(int i = 1 ; i < line.length(); i++) {String prefix = line.substring(0, i);jedis.zadd(COMPLETE_KEY, 0, prefix);}jedis.zadd(COMPLETE_KEY, 0, line + "*");}System.out.println("finish to add all values to zset");}private static Set<String> complete(String prefix , int count) {Set<String> results = new HashSet<String>();int rangeLength = 50; // This is not random, try to get replies < MTU sizeLong start = jedis.zrank(COMPLETE_KEY, prefix);if (start != null && start > 0) {int begin = start.intValue();while(results.size() != rangeLength) {Set<String> rs = jedis.zrange(COMPLETE_KEY,begin,begin + rangeLength-1); begin += rangeLength;if (rs == null || rs.size() == 0) {break;}for (Iterator<String> iterator = rs.iterator(); iterator.hasNext();) {String entry = (String) iterator.next();int min = Math.min(entry.length(), prefix.length());if (!entry.substring(0, min).equals(prefix.substring(0, min))) {count = rs.size();break;}if (entry.substring(entry.length() - 1).equals("*") && results.size() != count) {results.add(entry.substring(0, entry.length()-1));}}}}return results;}}code]试试,看行不行!
解决方案二:
估计是看到分多吧,哈哈,不过我比较关心楼主翻译成java的用意啊。。。。
解决方案三:
有意思,还真是一模一样啊
解决方案四:
楼上没搞错吧,完全复制我的代码!
解决方案五:
我测试过用我这个[/ package nosql; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import redis.clients.jedis.Jedis; public class RedisDemo { private final static String COMPLETE_KEY = "compl"; private final static Jedis jedis = new Jedis("192.168.118.2"); public static void main(String[] args) throws Exception { if(jedis.exists(COMPLETE_KEY)) { System.err.println("NOT loading entries, there is already a '" + COMPLETE_KEY + "' keyn"); } else { setupCompletedSet(); } Set<String> set = complete("ma" , 50); for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) { System.out.println(iterator.next()); } } private static void setupCompletedSet() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(RedisDemo.class.getResourceAsStream("female-names.txt"))); String line = null; while((line = br.readLine()) != null) { for(int i = 1 ; i < line.length(); i++) { String prefix = line.substring(0, i); jedis.zadd(COMPLETE_KEY, 0, prefix); } jedis.zadd(COMPLETE_KEY, 0, line + "*"); } System.out.println("finish to add all values to zset"); } private static Set<String> complete(String prefix , int count) { Set<String> results = new HashSet<String>(); int rangeLength = 50; // This is not random, try to get replies < MTU size Long start = jedis.zrank(COMPLETE_KEY, prefix); if (start != null && start > 0) { int begin = start.intValue(); while(results.size() != rangeLength) { Set<String> rs = jedis.zrange(COMPLETE_KEY,begin,begin + rangeLength-1); begin += rangeLength; if (rs == null || rs.size() == 0) { break; } for (Iterator<String> iterator = rs.iterator(); iterator.hasNext();) { String entry = (String) iterator.next(); int min = Math.min(entry.length(), prefix.length()); if (!entry.substring(0, min).equals(prefix.substring(0, min))) { count = rs.size(); break; } if (entry.substring(entry.length() - 1).equals("*") && results.size() != count) { results.add(entry.substring(0, entry.length()-1)); } } } } return results; } } code]