Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于CharMatcher.WHITESPACE实现_Java_Guava - Fatal编程技术网

Java 关于CharMatcher.WHITESPACE实现

Java 关于CharMatcher.WHITESPACE实现,java,guava,Java,Guava,当我查看CharMatcher的实现并注意到一个字段WHITESPACE\u乘数=1682554634,然后我将该值设置为158254634,运行testcaseCharMatcherTest\testWhitespaceBreakingWhitespaceSubset,当然失败了 之后,我将testWhitespaceBreakingWhitespaceSubset更改为仅调用WHITESPACE.apply((char)c)而不使用assert,使用WHITESPACE.matches的方法

当我查看
CharMatcher
的实现并注意到一个字段
WHITESPACE\u乘数=1682554634
,然后我将该值设置为
158254634
,运行testcase
CharMatcherTest\testWhitespaceBreakingWhitespaceSubset
,当然失败了

之后,我将testWhitespaceBreakingWhitespaceSubset更改为仅调用
WHITESPACE.apply((char)c)
而不使用assert,使用
WHITESPACE.matches的方法打印索引

int index=(空格\u乘数*c)>>>空格\u移位)
最后发现将
WHITESPACE\u乘数从
1682554634
更改为
1582554634

毫无疑问,1682554634设计得很好,我的问题是如何推断出这个“神奇数字”`

之后,我尝试按如下方式编写“幻数生成器”,并进行了工作:

char[]charsReq=WHITESPACE_TABLE.toCharArray();
Arrays.sort(charsReq);
外部:
for(int WHITESPACE\u MULTIPLIER\u WANTTED=1682553701;WHITESPACE\u MULTIPLIER\u WANTTED>WHITESPACE\u SHIFT);
如果(位置>=0&&index==c){
匹配CNT++;
}else if(位置<0&&index!=c){
匹配CNT++;
}否则{
继续对外开放;
}
}
//全部有效
if((matchCnt-1)==(int)(Character.MAX_值)){
System.out.println(空格\u乘数\u需要);
}
}
如果更改了空格_表中的字符序列(swap\u2001\u2002位置),则算法没有解决方案(将循环结束条件更改为Integer.MAX_值)


由于IntMath.gcd的实现是可参考的

我的问题是:我在哪里可以找到
CharMatcher.WHITESPACE.match
实现的资料?

我不确定生成器是否仍然存在,但它可以很容易地重新创建。类
Result
包含在以下操作中使用的数据:

静态类结果{
私人内部转移;
私有整数乘法器;
私有字符串表;
}
//不允许重复。
私有最终字符串allMatchingString=“\u2002\r\u0085\u200A\u2005\u2000”
+“\u2029\u000B\u2008\u2003\u205F\u1680”
+“\u0009\u0020\u2006\u2001\u202F\u00A0\u000C\u2009”
+“\u2004\u2028\n\u2007\u3000”;
公共结果生成(字符串allMatchingString){
final char[]allMatching=allMatchingString.toCharArray();
final char filler=allMatching[allMatching.length-1];
最终整数移位=整数.numberofleadingzero(allMatching.length);
最终字符[]表=新字符[1=0;++i){
final int multiplier=123456789*i;//稍微跳一点可以加快搜索速度。
数组。填充(表,填充);
for(最终字符c:allMatching){
最终整数指数=(乘数*c)>>>移位;
如果(表[index]!=filler)继续外部;//发现冲突。
表[索引]=c;
}
返回新结果(移位、乘法器、新字符串(表));
}
返回null;//不存在解决方案。
}
它会产生不同的乘数,但这并不重要


如果给定的
allMatchingString
不存在解决方案,您可以减小shift并重试。

我不确定您要问的是什么。是否仍不清楚该表是如何生成的?您的代码对于我所做的有点太复杂了。CharMatcher.WHITESPACE.match实现的Want资料。代码将生成非冲突索引随机数规划在这里:源代码似乎在这里:@Marichyasana:OP想知道,第1357行的
空格\u乘数是如何生成的,这不是在番石榴中。@Marichyasana感谢您提供信息
static class Result {
    private int shift;
    private int multiplier;
    private String table;
}

// No duplicates allowed.
private final String allMatchingString = "\u2002\r\u0085\u200A\u2005\u2000"
        + "\u2029\u000B\u2008\u2003\u205F\u1680"
        + "\u0009\u0020\u2006\u2001\u202F\u00A0\u000C\u2009"
        + "\u2004\u2028\n\u2007\u3000";

public Result generate(String allMatchingString) {
    final char[] allMatching = allMatchingString.toCharArray();
    final char filler = allMatching[allMatching.length - 1];
    final int shift = Integer.numberOfLeadingZeros(allMatching.length);
    final char[] table = new char[1 << (32 - shift)];
    OUTER: for (int i=0; i>=0; ++i) {
        final int multiplier = 123456789 * i; // Jumping a bit makes the search faster.
        Arrays.fill(table, filler);
        for (final char c : allMatching) {
            final int index = (multiplier * c) >>> shift;
            if (table[index] != filler) continue OUTER; // Conflict found.
            table[index] = c;
        }
        return new Result(shift, multiplier, new String(table));
    }
    return null; // No solution exists.
}