小编lor*_*llo的帖子

返回第一个非空值

我有很多功能:

String first(){}
String second(){}
...
String default(){}
Run Code Online (Sandbox Code Playgroud)

每个都可以返回一个空值,默认值除外.每个功能可以采用不同的参数.例如,第一个可以不带参数,第二个可以接受一个字符串,第三个可以接受三个参数,等等.我想做的是:

ObjectUtils.firstNonNull(first(), second(), ..., default());
Run Code Online (Sandbox Code Playgroud)

问题在于,由于函数调用,这需要进行急切的评估.我想早点退出,在第二个函数之后说(因为函数调用可能很昂贵,想想API调用等).在其他语言中,您可以执行与此类似的操作:

return first() || second() || ... || default()
Run Code Online (Sandbox Code Playgroud)

在Java中,我知道我可以做类似的事情:

String value;
if (value = first()) == null || (value = second()) == null ...
return value;
Run Code Online (Sandbox Code Playgroud)

由于所有的== null检查,这不是非常易读的IMO.ObjectUtils.firstNonNull()首先创建一个集合,然后迭代,只要该函数被懒惰地评估,这是可以的.

建议?(除了做一堆ifs)

java coalesce lazy-evaluation

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

Python asyncio是否使用线程池?

我写了这段代码:

import asyncio
import threading
from aiohttp import ClientSession

async def fetch(url):
    async with ClientSession() as session:
        async with session.get(url) as response:
            response = await response.read()
            print(threading.current_thread().name)


loop = asyncio.get_event_loop()

tasks = [asyncio.ensure_future(fetch("http://example.com")) for i in range(5)]

loop.run_until_complete(asyncio.wait(tasks))
Run Code Online (Sandbox Code Playgroud)

它每次打印出"MainThread".这是否意味着所有请求都是使用相同的主线程并发执行的,并且它不是使用线程池中的线程来执行每个请求,还是被抽象的线程?

这篇文章似乎表明,事实上有一个Python用于这些异步任务的线程池:http: //skipperkongen.dk/2016/09/09/easy-parallel-http-requests-with-python-and-asyncio /

python multithreading python-asyncio aiohttp

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

在嵌套括号内提取字符串

我需要从嵌套括号中提取字符串,如下所示:

[ this is [ hello [ who ] [what ] from the other side ] slim shady ]
Run Code Online (Sandbox Code Playgroud)

结果(订单无关紧要):

This is slim shady
Hello from the other side
Who 
What
Run Code Online (Sandbox Code Playgroud)

注意,字符串可以有N个括号,它们将始终有效,但可能嵌套也可能不嵌套.此外,字符串不必以括号开头.

我在网上找到类似问题的解决方案表明正则表达式,但我不确定它会在这种情况下起作用.

我正在考虑实现这类似于我们如何检查字符串是否具有所有有效括号:

穿过绳子.如果我们看到[我们在堆栈上推送它的索引,如果我们看到一个],我们从那里子串到当前点.

但是,我们需要从原始字符串中删除该子字符串,因此我们不会将其作为任何输出的一部分.所以,我没有推动只是将索引推入堆栈,而是在考虑创建一个LinkedList,当我们找到[我们在LinkedList上插入该Node时].这将允许我们从LinkedList中轻松删除子字符串.

这是一个好方法还是有一个更清洁,已知的解决方案?

编辑:

'[ this is [ hello [ who ] [what ] from the other [side] ] slim shady ][oh my [g[a[w[d]]]]]'
Run Code Online (Sandbox Code Playgroud)

应该退货(订单无关紧要):

this is slim shady
hello from the other
who 
what 
side
oh my
g
a
w
d …
Run Code Online (Sandbox Code Playgroud)

python algorithm brackets

6
推荐指数
2
解决办法
2052
查看次数

CompletableFuture多线程,单线程并发,还是两者兼而有之?

我刚刚开始研究Java的CompletableFuture,并对这是否真正异步(即同时在一个线程上运行)或跨越多个线程(并行)有点困惑.

例如,假设我想要进行1000次不同的服务呼叫.进一步假设每个服务调用可以异步进行.使用CompletableFuture时,JVM是否会生成1000个单独的线程(假设JVM允许这么多线程),或者在一个线程中执行所有这些请求?或者是两者兼而有之?使用一些线程异步执行这些请求?

我想做的是这样的(在Python中):https: //pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html

有没有办法在Java中异步执行同一个线程上的多个请求/操作?

java concurrency multithreading completable-future

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

比较列表中所有相邻元素的Pythonic方法

我想知道是否有更多的Pythonic方法来执行以下操作:

A = some list
i = 0
j = 1
for _ in range(1, len(A)):
    #some operation between A[i] and A[j]
    i += 1
    j += 1
Run Code Online (Sandbox Code Playgroud)

我觉得这应该/可以做得不同.想法?

编辑:因为有些人要求要求.我想要一个通用的答案.也许检查A [i],A [j]是否在某个范围之间,或者它们是否相等.或许我想做一个"涓涓细流"的元素.越普遍越好.

python python-3.x

4
推荐指数
2
解决办法
3756
查看次数

字典对列表值的理解

我想知道是否有更Pythonic的方法可以执行以下操作,也许使用字典理解:

A = some list
D = {}
for i,v in enumerate(A):
    if v in D:
        D[v].append(i)
    else:
        D[v] = [i]
Run Code Online (Sandbox Code Playgroud)

python list-comprehension python-3.x dictionary-comprehension

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

博耶-摩尔加利尔规则

当我了解Galil Rule时,我正在为 Python 中的子字符串搜索实现Boyer-Moore 算法。我在网上四处寻找 Galil 规则,但除了几句话我什么也没找到,而且我无法访问原始论文。如何将其实现到我当前的算法中?

i = 0
while i < (N - M + 1):
    skip = 0
    for j in reversed(range(0, M)):
        if pattern[j] != text[i + j]:
            skip = max(1, j - offsets[text[i+j]])
            break
    if skip == 0:
        return i
    i += skip
return -1
Run Code Online (Sandbox Code Playgroud)

笔记:

  • offsets[c] = -1 如果 c 不在模式中
  • offsets[c] = 模式中 c 的最后一个索引

示例:aaabcb

  • 偏移[a] = 2
  • 偏移[b] = 5
  • 偏移[c] = 4
  • 偏移[d] = -1

我发现的几句话说要跟踪我的内部循环中第一次不匹配发生的时间(j,如果内部循环中的 …

algorithm substring

2
推荐指数
1
解决办法
1909
查看次数

拆分列表F Sharp

我正在尝试编写一个将列表拆分为两个的方法.该函数应返回两个列表的元组,函数所采用的参数是第一个列表中的项目数,然后是列表.这就是我的意思

清单[1,2,3,4]

split(1,list) - >([1],[2,3,4])split(3,list) - >([1,2,3],[4])

这是我到目前为止所拥有的:

let rec mysplit = function
  |(n,[])->([],[])
  |(1,x::xs)->(x::[],xs)
  |(n,x::xs)->  mysplit(n-1,xs)
Run Code Online (Sandbox Code Playgroud)

我不确定如何从递归调用中"捕获"元组.不知道在哪里有一个额外的let语句来暂时保存我正在构建的列表.对语言不熟悉所以有两种不同的方法可以学习.

f# list

0
推荐指数
1
解决办法
1037
查看次数