小编Jef*_*oom的帖子

正则表达式匹配一个类的导入

我一直在努力编写一个正则表达式来匹配类的导入.让班级成为

import static org.junit.Assert.*;
import org.
       package.
       Test;
import mypackage.mystuff;
Run Code Online (Sandbox Code Playgroud)

输出应该是[org.junit.Assert.*,org.package.Test,mypackage.mystuff].因为我不熟悉它们,所以我一直在努力使用换行符和正则表达式.这是我目前的尝试:

((?<=\bimport\s)\s*([^\s]+ )*([a-z.A-Z0-9]+.(?=;))) 
Run Code Online (Sandbox Code Playgroud)

java regex

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

最大产品子序列

我需要按n整数序列找到子序列的最大乘积.我正在寻找一种算法,不一定表示为代码.

例:

  1. 在:3,1,-2,4.出:4.
  2. 在:2,5,-1,-2,-4.出:20.(2*5*-1*-2).

我已经完成了算法O(n²),但现在我需要一个算法O(n).
我知道这是可能的.

怎么办O(n)呢?

algorithm

7
推荐指数
1
解决办法
4638
查看次数

找到流的最小元素,但如果它<= N则提前拯救

我想找到一个大的(数亿个元素)IntStream的最小元素,但我只能使用结果,如果它是> N,所以我想在找到一个元素<= N时拯救我.我期望最小值在大多数情况下<= N.

IntStream.min()不会短路,所以我会被困在处理所有元素.将军IntStream.reduce也不会短路.

IntStream.noneMatch(x -> x <= N)将确保最小元素> N并且如果不是则确实短路,但实际上并没有告诉我最小值.我必须在谓词中维护状态(并添加同步或限于顺序流)以记住实际的最小值.或者,我可以增加N并再次尝试,可能在可能的N范围内进行某种二分搜索,但这听起来既缓慢又复杂.

一旦知道<= N,我怎样才能找到IntStream的最小值,短路?

java java-8 java-stream

7
推荐指数
1
解决办法
273
查看次数

我如何懒洋洋地连接流?

我正在尝试实现一个在其实现中使用自身的另一个实例的流.该流有一些常量元素(使用IntStream.concat),因此只要连接流懒惰地创建非常量部分,这应该有效.我认为使用StreamSupport.intStream重载使用IntStream.concat的供应商("创建一个延迟连接的流")应该足够懒,只能在需要元素时创建第二个分裂器,但是甚至创建流(不评估)它)溢出堆栈.我如何懒洋洋地连接流?


我正试图将这个答案的流媒体素数筛选器移植到Java中.此筛使用其自身的另一个实例(ps = postponed_sieve()在Python代码中).如果我将最初的四个常量元素(yield 2; yield 3; yield 5; yield 7;)分解为它们自己的流,那么很容易将生成器实现为一个分裂器:

/**
 * based on https://stackoverflow.com/a/10733621/3614835
 */
static class PrimeSpliterator extends Spliterators.AbstractIntSpliterator {
    private static final int CHARACTERISTICS = Spliterator.DISTINCT | Spliterator.IMMUTABLE | Spliterator.NONNULL | Spliterator.ORDERED | Spliterator.SORTED;
    private final Map<Integer, Supplier<IntStream>> sieve = new HashMap<>();
    private final PrimitiveIterator.OfInt postponedSieve = primes().iterator();
    private int p, q, c = 9;
    private Supplier<IntStream> s;
    PrimeSpliterator() {
        super(105097564 /* according to …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

7
推荐指数
1
解决办法
1162
查看次数

对于一元静态方法的方法引用在Function和BiFunction参数类型之间是不明确的

考虑以下简化的测试用例:

import java.util.AbstractList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
public final class Example {
    static class PairList<A, B> {
        public void replaceAllSecond(Function<? super B, ? extends B> secondFunction) {}
        public void replaceAllSecond(BiFunction<? super A, ? super B, ? extends B> secondFunction) {}
    }

    static class ImmutableList<E> extends AbstractList<E> {
        public static <E> ImmutableList<E> copyOf(Iterable<? extends E> elements) {return null;}
        public static <E> ImmutableList<E> copyOf(Collection<? extends E> elements) {return null;}
        public static <E> ImmutableList<E> copyOf(Iterator<? extends E> …
Run Code Online (Sandbox Code Playgroud)

java jls java-8 method-reference

7
推荐指数
1
解决办法
165
查看次数

字对齐加载比x64处理器上的未对齐加载更快吗?

在x86/64(Intel/AMD 64位)处理器上,在字边界上对齐的变量是否比未对齐的加载操作更快?

我的一位同事辩称,未对齐的载荷很慢,应该避免.他引用了项目填充到结构中的单词边界,作为未对齐加载缓慢的证明.例:

struct A {
  char a;
  uint64_t b;
};
Run Code Online (Sandbox Code Playgroud)

结构A通常大小为16个字节.

另一方面,Snappy压缩器文档指出Snappy假设"未对齐的32位和64位加载和存储很便宜".根据源代码,英特尔32和64位处理器也是如此.

那么:这里的真相是什么?如果和未对齐的载荷减少多少?在哪种情况下?

c x86-64 alignment

6
推荐指数
3
解决办法
4822
查看次数

以编程方式向"提醒"应用添加提醒

我正在创建一个简单的笔记应用程序,我想实现提醒.用户可以键入注释,点击按钮,然后使用文本在"提醒"应用中设置提醒.这是可能的,如果是的话,我该怎么做?我在EventKit和EKReminders上看到了Apple的文档,但它根本没有任何帮助.

reminders ios eventkit

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

如何使用ASM控制常量池条目的顺序?

我正在实现一个转换,从.class文件中删除未使用的元素以减小它们的大小.因为一些常量池条目将被使用,我让ASM重新计算常量池,而不是从输入中复制它.但是,转换后的.class文件有时比原始文件大,因为ASM的常量池排序需要使用ldc_w输入.class文件ldc(带有1字节索引)的指令(带有2 字节索引).我想手动对常量池进行排序,以便ldc首先引用常量.

有人可能也想要出于其他原因对常量池进行排序:例如,通过将其常量池按规范顺序排列,使一组.class文件更易于压缩,以测试使用.class文件的工具,将订单用作软件水印,或混淆不良实施的反编译器/反混淆器.

我在ASM指南中搜索了"常量",但除了常量池的常规解释之外没有任何有用的命中,并且"希望ASM隐藏与常量池相关的所有细节,因此您不必为此烦恼",在这种情况下,这是有帮助的.

如何控制ASM发出常量池条目的顺序?

java jvm java-bytecode-asm

6
推荐指数
1
解决办法
1206
查看次数

为什么Java要求"在给定的Java虚拟机中最多可以调用一次此方法"?

在静态方法URL.setURLStreamHandlerFactory的Java文档中,有一条警告"在给定的Java虚拟机中最多可以调用一次此方法".

http://docs.oracle.com/javase/7/docs/api/java/net/URL.html#setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory)

我简要地看了一下源代码,在URL类中有一个静态实例变量:

static URLStreamHandlerFactory factory;
Run Code Online (Sandbox Code Playgroud)

和setURLStreamHandlerFactory只是将工厂分配给这个变量:

public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) {
    synchronized (streamHandlerLock) {
        if (factory != null) {
            throw new Error("factory already defined");
        }

        SecurityManager security = System.getSecurityManager();

        if (security != null) {
            security.checkSetFactory();
        }

        handlers.clear();

        factory = fac;
    }
}
Run Code Online (Sandbox Code Playgroud)

允许多次调用此方法将导致覆盖此工厂实例变量,但我不明白为什么Java会想要阻止此行为.

为什么Java要求每个JVM只能调用一次此方法?

java jvm

6
推荐指数
1
解决办法
285
查看次数

在Java8中将两个ArrayLists相乘和求和

我有两个名为A和B的ArrayLists,大小相等,包含一些数字.现在我要计算这样的事情:

int sum = 0;
for(int i=0; i<A.size() && i<B.size(); i++) {
  sum += A.get(i)*B.get(i);
}
Run Code Online (Sandbox Code Playgroud)

如何在不使用任何额外的用户定义方法的情况下,通过使用Java 8功能(流,lambda表达式等)来实现上面的工作,计算总和?

java java-8 java-stream

6
推荐指数
1
解决办法
2280
查看次数