小编elh*_*efe的帖子

Jackson JsonNode用排序键来串

我正在使用Jackson 2.2.3,需要将JsonNode树转换为带有排序字段键的字符串.我完全不清楚如何做到这一点,特别是因为相反的情况如此简单 - JsonNode jn = ObjectMapper.readTree(String s).

看来正确的方法是void writeTree(JsonGenerator jgen,JsonNode rootNode).但是,我认为没有办法String从序列化中获取序列化JsonGenerator.我认为这SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS仍然适用,因为JsonGenerator.Features没有那个选项.有没有更简单的方法 - 或者如果没有,我如何从JsonGenerator?检索序列化的字符串?

java sorting jackson

23
推荐指数
1
解决办法
3万
查看次数

以字节为单位获取String w/encoding的大小而不转换为byte []

我有一种情况,我需要知道一个String/编码对的大小,以字节为单位,但不能使用该getBytes()方法,因为1)String非常大并且复制String在一个byte[]数组中将使用大量的内存,但更多的是第2点)根据*每个字符的最大可能字节长度getBytes()分配一个byte[]数组String.因此,如果我有String1.5B字符和UTF-16编码,getBytes()将尝试分配3GB数组并失败,因为数组限制为2 ^ 32 - X字节(X是特定于Java版本).

那么 - 有没有办法String直接从String对象计算/编码对的字节大小?

更新:

这是jtahlborn答案的工作实现:

private class CountingOutputStream extends OutputStream {
    int total;

    @Override
    public void write(int i) {
        throw new RuntimeException("don't use");
    }
    @Override
    public void write(byte[] b) {
        total += b.length;
    }

    @Override public void write(byte[] b, int offset, int len) {
        total += len;
    }
}
Run Code Online (Sandbox Code Playgroud)

java string size byte

17
推荐指数
1
解决办法
1万
查看次数

什么是wrapper_descriptor,为什么Foo .__ init __()在这种情况下是一个?

import inspect

class Foo(object):
    pass

if __name__ == '__main__':
    print type(Foo.__init__)
    print inspect.getsourcelines(Foo.__init__)
Run Code Online (Sandbox Code Playgroud)

输出:

<type 'wrapper_descriptor'>
Traceback (most recent call last):
  *snip*
  File "/usr/lib/python2.7/inspect.py", line 420, in getfile
    'function, traceback, frame, or code object'.format(object))
TypeError: <slot wrapper '__init__' of 'object' objects> is not a module, class, method, function, traceback, frame, or code object
Run Code Online (Sandbox Code Playgroud)

谷歌搜索几乎没有提供有关什么,确切地说,wrapper_descriptor是什么,以及为什么空类有一个__init__方法不是一个方法,而是一个wrapper_descriptor.

到底发生了什么?没有__init__方法的所有类都有这些wrapper_descriptor之一吗?为什么__init__课堂上有一个词典呢?

python initialization

13
推荐指数
1
解决办法
2850
查看次数

如何使用索引进行排序在MongoDB中有效?

我想知道如何使用索引进行排序实际上在MongoDB中有效.有一对夫妇 的文章 MongoDB的文档中,但它们实际上并不说明如何排序所得或者时间复杂度.到目前为止,搜索SO和一般的互联网并没有发现任何相关的东西.

让我们假设有一个集合中的文档,查找()子句匹配b文件,还有的限制ç文档返回,一个 >> b >> Ç,和Ç是一些适当大的数量,使得返回集合无法适从内存 - 例如,假设1M文档.

在操作的开始,存在b需要进行排序和大小的排序树索引文件,一个为特征的文件将被排序.

我能想象:

A)按顺序遍历索引,并为每个ObjectID遍历b文档列表.返回匹配项,直到达到c.这将是O(ab).

B)作为A),但首先在b文档中构建ObjectID的哈希集.这是O(a),但需要O(b)内存.

我试图考虑基于遍历b文档集的排序,但似乎没有提出比O(b log b)更快的任何东西,这并不比没有索引的排序更好.

我假设(但也许我错了)每种类型都不需要索引扫描,那么排序实际上如何工作?

更新:

凯文的答案和提供的链接缩小了这个问题的范围,但我想确认/澄清几点:

  1. 据我了解,如果要避免内存排序,则不能对查询和排序使用不同的索引.当我读到这个页面时,它似乎可以(或者至少,它没有指定一种方式或另一种方式),但这似乎是不正确的.本质上,文档是排序的,因为它们在查询期间按索引的顺序查找,因此按索引的顺序返回.对?
  2. 查询复合索引时,排序索引必须是复合索引中的第一个索引,但查询相等的索引除外.如果不是,则在内存中执行排序.对?
  3. 排序如何处理$in$or查询?例如,假设查询是

    {a: {$in: [4, 6, 2, 1, 3, 10]}, b: {$gt: 1, $lt: 6}}

......并有一个复合索引a,并 …

sorting indexing time-complexity mongodb

13
推荐指数
1
解决办法
8994
查看次数

绘制4连线的算法

我正在寻找一种算法(用Java编码会很好,但是任何足够清晰的转换为Java都很好)来绘制一条4连接线.似乎Bresenham的算法是使用最广泛的算法,但我发现的所有可理解的实现都是8连接的.OpenCV的cvline函数显然有一个4连接版本,但对我来说,源代码是一个平庸而且几乎是C文盲的程序员,难以理解.其他各种搜索都没有发现.

感谢任何人都能提供的帮助.

graphics line bresenham

11
推荐指数
2
解决办法
4129
查看次数

RESTful服务参数必须是可发现的吗?

序言:我对REST的理解充其量是浅薄的,因此欢迎对我的问题进行任何更正或澄清.

我有一种情况,我需要RESTful服务的用户提交任意真正的正数.因此,我假设我不应该在url中要求它,即使返回的对象应该是相同的,并且应该使用参数(或者这个假设是错误的?).

鉴于此,为了符合REST,参数必须以某种方式被发现吗?我无法找到任何能让我清楚的事情.

如果没有,我进一步假设参数需要以其他方式记录,从而锁定(当前api的一部分),据我所知,这是不可取的,因为资源应该通过跟随超文本链接找到比硬编码位置(和这种情况下的参数).

假设参数必须是可发现的,有没有办法在tastypie/django中这样做?

django parameters rest discoverability tastypie

11
推荐指数
1
解决办法
506
查看次数

阻止/更改对类变量的访问

有没有办法防止或改变Python中类变量的访问,因为可以通过覆盖__setattr__实例变量?

请注意,此问题是错误的,实际上是指实例变量,而不是类变量.

在阅读关于(明显的)死亡陷阱的多篇帖子的基础上__slots__,我宁愿不去那条路(而且我没有足够深入地了解它是否符合我的要求).

例:

class A(object):

    foo = "don't change me"

    def __setattr__(self, name, value):
        raise ValueError

if __name__ == '__main__':
a1 = A()
print a1.foo # don't change me
print A.foo  # don't change me

A.foo = 'bar' # ideally throw an exception or something here
print A.foo   # bar
a2 = A()
print a1.foo  # bar
print a2.foo  # bar
Run Code Online (Sandbox Code Playgroud)

python class-variables

8
推荐指数
2
解决办法
4910
查看次数

在<p> </ p>中抑制python markdown包装文本

我使用python markdown作为Jinja2的过滤器来生成html.作为其中的一部分,我从渲染输入中填写表条目.通过markdown过滤器传递输入始终将文本包装在段落标记中,因此表中的每个条目都包含在内<p></p>,这是我不想要的.

我已经阅读了降价文档和第三方扩展名列表,但除了编写自己的扩展名外,似乎无法抑制此行为.有没有其他方法可以抑制段落标记包装?或者我是以错误的方式来做这件事的?

更新:这是我现在正在使用的脏兮兮的糟糕黑客:

def safe_markdown(text):
  p = '<p>'
  np = '</p>'
  md = markdown.markdown(text)
  if md.startswith(p) and md.endswith(np): #you filthy bastard
    md = md[len(p):-len(np)]
  return jinja2.Markup(md)

env = jinja2.Environment(...)
env.filters['markdown'] = safe_markdown 
Run Code Online (Sandbox Code Playgroud)

更新2(回应亚伦的回答):

感谢帮助,但这肯定是导致问题的降价.这是jinja模板的示例部分:

        {%- if spc.docs -%}
<td>{{ spc.docs|markdown }}</td></tr>
        {%- else -%}
<td></td></tr>
        {%- endif -%}
Run Code Online (Sandbox Code Playgroud)

如果spc.docs只是'foo'生成的html会结束,<td><p>foo</p></td></tr>除非我使用肮脏的黑客.

更新3

这是一个不那么讨厌的黑客,虽然仍然是一个黑客,而不是真正的'答案',IMO.

def safe_markdown(text):
    md = markdown.markdown(text)
    return jinja2.Markup(md)

def safe_markdown_td(text):
    text = ''.join(['<td>', text, '</td>'])
    return safe_markdown(text)

env …
Run Code Online (Sandbox Code Playgroud)

python markdown templating jinja2

8
推荐指数
1
解决办法
1922
查看次数

强制 JSON.stringify() 发出 NaN / Infinity 或这样做的 JS JSON 库

我正在研究将 NaN/Infinity 支持添加到使用 JSONRPC 进行客户端/服务器交互的现有科学应用程序的可行性。许多 JSON 库确实处理(在某些情况下可选)NaN 和 Infs,例如:

  • Python json读写
  • Java Jackson读取但写入字符串而不是裸字
  • Java GSON读写
  • Javascript 可以读取

我知道JSON 规范不支持 NaN 和 Infinity ,并且知道相关 问题。但是,AFAICT 是否有某种方法可以强制本机 JSJSON.stringify()方法发出 NaN/Infinity,或者是否有一个 JS JSON 库可以执行相同操作的问题尚未得到解答。与参考问题的细微差别,也许,但很重要。到目前为止,我一直无法发现这样的方法或库,所以我在这里。编写自己的 JSON 序列化程序是唯一的选择吗?

请注意,replacement参数 ofJSON.stringify()没有帮助,至少在我手中。

更新:将NaN/Infinity 等作为字符串发出会使这些字符串的语义不明确。它们需要像在 Python 和 GSON 实现中一样作为裸字发出。

javascript json nan infinity

5
推荐指数
1
解决办法
3656
查看次数

如果 MongoDB 批量更新适用于同一个文档,它们是否是原子的?

对于以下命令, wherequery只能匹配一个文档(请注意,bulkWrite()默认情况下是有序的):

final BulkWriteResult res = db.getCollection("mycol").bulkWrite(Arrays.asList(
    new UpdateOneModel<>(query,
        new Document("$addToSet", new Document("some_things", things))),
    new UpdateOneModel<>(query,
        new Document("$pull", new Document("some_things", otherthings)))));
Run Code Online (Sandbox Code Playgroud)

...我知道如果第一次更新成功而第二次失败(在正常情况下应该是不可能的),第一次更新仍将应用于文档,这意味着批量写入不是严格原子的。但是,假设两个查询都成功,操作是原子的吗?例如,其他写入是否可以在两个操作之间交错?

atomic atomicity mongodb bulkupdate interleave

5
推荐指数
0
解决办法
247
查看次数