[code="ruby"]
require 'rubygems'
require 'redis'
r = Redis.new
if !r.exists(:compl)
puts "Loading entries in the Redis DB\n"
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' key\n"
end
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 results
end
complete(r,"marcell",50).each{|res|
puts res
}
[/code]
[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 + "' key\n");
} 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]
试试,看行不行!
我测试过用我这个
[color=blue][/
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 + "' key\n");
} else {
setupCompletedSet();
}
Set set = complete("ma" , 50);
for (Iterator 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 complete(String prefix , int count) {
Set results = new HashSet();
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 rs = jedis.zrange(COMPLETE_KEY,begin,begin + rangeLength-1);
begin += rangeLength;
if (rs == null || rs.size() == 0) {
break;
}
for (Iterator 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][/color]
楼上没搞错吧,完全复制我的代码!
有意思,还真是一模一样啊
估计是看到分多吧,哈哈,不过我比较关心楼主翻译成java的用意啊。。。。