我有这段Scala代码,它定义了一个排序并将其应用于TreeSet.这部分编译得很好.
val acctOrdering = new Ordering[Account] {
def compare(acc1: Account, acc2: Account) {
// code to compare based on various criteria
}
}
private var accountSet = new TreeSet[Account]()(acctOrdering)
Run Code Online (Sandbox Code Playgroud)
在代码的其他地方,我希望得到集合中的第一个元素(如果第一个元素没有产生我想要的东西,后来会得到后续元素,尽管通常不需要),基于我之前的顺序指定.我认为以下可行,但它没有编译:
val firstAccount = accountSet.min
Run Code Online (Sandbox Code Playgroud)
错误是 "could not find implicit value for parameter cmp: Ordering[Account]"
但是,如果我在要求最小值时再次指定排序对象,则编译:
val firstAccount = accountSet.min(acctOrdering)
Run Code Online (Sandbox Code Playgroud)
我以为它会自动使用我在构造时给出的顺序,并在我添加到集合时逐步排序,所以我不必在调用时再次指定顺序min.
我究竟做错了什么?我是否需要在某处明确定义隐式函数?
我有由user_ids和这些用户ID的标签组成的数据.user_ids多次出现并且具有预先指定数量的标记(500),但是可能在该特征中发生变化.必须存储的是user_id,它们的标签和它们的数量.我希望以后能够轻松找到最高分的标签..等.每次出现标签时,它都会增加
我在redis中的实现是使用有序集完成的
每个user_id都是一个有序集
key是user_id,是十六进制数
像这样工作:
zincrby user_id:x 1"tag0"
zincrby user_id:x 1"tag499"
zincrby user_id:y 1"tag3"
等等
考虑到我想获得得分最高的标签,有更好的方法吗?
第二个问题是,现在我正在使用"keys*"来检索客户端操作的这些密钥,我知道它不是针对生产系统的.
此外,对于内存问题来说,迭代指定数量的键(范围为10000)会很棒.我知道密钥必须存储在内存中,但是它们不遵循特定模式以允许部分检索,因此我可以避免"zmalloc"错误(4GB 64位debian服务器).钥匙数量达到2000万.有什么想法吗?
我注意到Java中的Set和SortedSet接口之间存在逻辑不一致.
如果在比较期间它们是相同的,则SortedSet将不同的对象(通过equal()方法)识别为equals,但它在逻辑上是不正确的.对象的比较应仅对对象的顺序负责.
例如:我可以有很多产品,我想按价格对它们进行排序.在这种情况下,SortedSet不能包含具有相同价格的不同产品:["salt",0.5 $],["milk",1 $],["bread",1 $],["bananas",2 $在上面的例子中,牛奶将被面包取代.在这种情况下,将违反继承的Set接口的合同,因为不相等的对象会相互替换.我是Reded JavaDoc的SortedSet,并且知道这个行为有很好的记录,但我认为这是一个逻辑上的失败.
你有什么看法,也许你已经和Set和SortedSet有类似的问题了?
阅读本 Oracle教程,我偶然发现了List的范围视图操作与SortedSet接口提供的操作之间差异的解释.
这有点兴趣:
范围视图操作有点类似于List接口提供的操作,但有一个很大的区别.即使直接修改了后备排序集,排序集的范围视图仍然有效.这是可行的,因为有序集的范围视图的端点是元素空间中的绝对点,而不是后备集合中的特定元素,如列表的情况.
是否有人能够用其他词语解释大胆的部分?
提前致谢.
我想得到一个SortedSet的独家尾部集.我能提出的最短的方法是:
private void exclusiveTailSet(SortedSet<String> s, String start) {
System.out.println(s); // [Five, Four, One, Six, Start, Three, Two]
SortedSet<String> t = s.tailSet(start);
System.out.println(t); // [Start, Three, Two]
Iterator<String> i = t.iterator();
i.next();
SortedSet<String> u = t.tailSet(i.next());
System.out.println(u); // [Three, Two]
}
Run Code Online (Sandbox Code Playgroud)
tailSet的javadoc建议从域中的下一个元素开始请求子集(即对于字符串调用s.tailSet(start+"\0");),但是我实际上正在使用对象,这样创建它就会更多.
什么是创建独有尾部集的有效且干净的通用方法?
我想说我有一个List.在for循环中修改list的项目没有问题:
for (int i = 0; i < list.size(); i++) { list.get(i).setId(i); }
Run Code Online (Sandbox Code Playgroud)
但是我有一个SortedSet而不是list.我怎么能用它呢?谢谢
ZADD myset 1 ad1
ZADD myset 1 ad2
SET order:ad1 1
SET order:ad2 2
Run Code Online (Sandbox Code Playgroud)
如何先按订购的套装分数排序,然后再按订单价值排序?
redis中排序集和列表之间的空间差异是什么?我的猜测是有序集是某种平衡的二叉树,列表是链表.这意味着除了我为每个值编码的三个值之外,密钥,分数,值,虽然我将链接列表的得分和值组合在一起,但开销是链接列表需要跟踪一个其他节点和二叉树需要跟踪两个节点,因此使用有序集合的空间开销是O(N).
如果我的值和得分都是长的,并且指向其他节点的指针也很长,那么在64位计算机上,单个节点的空间开销似乎从3长到4长,这是33%增加空间.
这是真的?
对于我正在研究的应用程序,我正在使用Redis中的有序集来存储具有时间戳作为分数和作为成员的任意消息的项目.然后我计划使用zscan来按顺序从排序集中检索项目.顺序对应用程序很重要,这就是我想使用有序集的原因.
事情似乎进展顺利,直到我试图用zscan检索项目,他们似乎出了问题.例如,我设置了一个测试,我将1000个项目添加到有序集合中,使用整数值作为分数,将字符串表示作为成员(为简洁省略了初始化):
for( int i = 0; i < 1000; i++){
jedis.zadd(CHANNEL, i, Integer.toString(i));
}
ScanResult<Tuple> result = jedis.zscan("TEST_CHANNEL", "0", new ScanParams().count(10));
Run Code Online (Sandbox Code Playgroud)
我收到的物品似乎是随机的.使用redis-cli运行zscan确认测试结果相同:
127.0.0.1:6379> zscan "TEST_CHANNEL" 0
Run Code Online (Sandbox Code Playgroud)
返回结果125,588,568,144 .....
执行从0到10的zrange正确地将成员从"0"返回到"10".
我已经尝试查看文档(http://redis.io/commands/zscan),但我找不到任何确认zscan是否应该或不应该按分数顺序返回结果的内容,并且希望有人能够澄清是否我看到了一个错误,预期的行为,或者只是做错了.
我正在使用Redis 3.0.1
我创建了一个这样的Student类:
public class Student implements Comparable<Student> {
private String firstName;
private String lastName;
public Student(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// Getters & Setters follow here...
@Override
public int compareTo(Student student) {
int hash = this.firstName.compareTo(student.firstName);
return hash;
}
@Override
public String toString() {
return "Student [firstName=" + firstName + ", lastName=" + lastName
+ "]";
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试类,我只是在我的TreeSet中添加元素:
public class SortedSetExample1 {
public static void main(String[] args) {
SortedSet<Student> set = new TreeSet<Student>(); …Run Code Online (Sandbox Code Playgroud)