我指的是Sedgewick的书"Algorithms"(第4版)中用于子串搜索的Knuth-Morris-Pratt(KMP)算法的概述.
KMP算法在子串搜索中使用基于确定性有限自动机(DFA)的备份.我了解DFA如何输入算法,但我不明白如何构建 DFA,这由以下代码片段完成:
dfa[pat.charAt(0)][0] = 1;
for (int X = 0; j = 1; j< M; j++) {
for (int c = 0; c < R; c++) {
dfa[c][j] = dfa[c][X];
}
dfa[pat.charAt(j)][j] = j+1;
X = dfa[pat.charAt(j)][X];
}
Run Code Online (Sandbox Code Playgroud)
M模式的长度pat和R字母的大小在哪里.该charAt()函数返回相应位置的字符的整数值.
有人能解释这段代码构造dfa的方式吗?我迷失在内部for循环的实际直觉意义上.
我正在使用Retrofit 2库来安装Android REST客户端.Retrofit本身支持同步和异步请求(参见此处),后者的原因是不阻塞线程,因此不会被android中断.
实际上,AsyncTask直接从Retrofit 在本机或异步调用中使用同步调用会更好吗?如果一个比另一个好,那么技术原因是什么?
我想使用Jackson库(https://github.com/FasterXML/jackson)处理Java中的JSON文件,该文件由JSON模式文件描述。
现在,我想验证是否已解析的JSON符合由自己解析的JSON模式文件。
Jackson有一个JSON模式模块(https://github.com/FasterXML/jackson-module-jsonSchema)。但是,在我看来,它的主要重点是从Java内部创建 JSON模式文件。
在Java中验证JSON模式的好方法是什么?-最好使用Jackson,但我也愿意接受其他解决方案。
我有一个静态函数,其泛型类型具有以下签名 T
public static<T> List<T> sortMap(Map<T, Comparable> map)
Run Code Online (Sandbox Code Playgroud)
应返回带有某些属性的地图键列表.
现在我想传递一个类型的泛型HashMap S
Map<S,Double> map
Run Code Online (Sandbox Code Playgroud)
调用泛型类中的静态函数,该类将映射作为成员变量.
我在下面列出了一个最小的代码示例.
但是,我得到一条错误消息(S并且T都是T,但在我的代码的不同范围内,即T#1= T,T#2= S):
required: Map<T#1,Comparable>
found: Map<T#2,Double>
reason: cannot infer type-variable(s) T#1
(argument mismatch; Map<T#2,Double> cannot be converted to Map<T#1,Comparable>)
Run Code Online (Sandbox Code Playgroud)
怎么解决这个问题?我很惊讶Java不允许从泛型类型推断泛型类型.Java中的哪种结构可以用来处理那种更抽象的代码推理?
代码:
public class ExampleClass<T> {
Map<T, Double> map;
public ExampleClass () {
this.map = new HashMap();
}
//the following line produces the mentioned error
List<T> sortedMapKeys = UtilityMethods.sortMap(map);
}
public class UtilityMethods { …Run Code Online (Sandbox Code Playgroud) 考虑一个带有ArrayList引用的函数的for循环,并将一个对象添加到该ArrayList.我现在想并行执行每个函数调用.
如果我不关心添加对象的序列并且没有函数读取或操作任何ArrayList元素,那么ArrayList.add()方法线程是否安全?所以我只想确保在并行调用结束时将所有对象添加到列表中.
假设我有数据类型
data Price = Price Double
data Book = Book {title :: String, bookPrice :: Price}
Run Code Online (Sandbox Code Playgroud)
用函数提取数值
priceAsDouble :: Price -> Double
priceAsDouble (Price doubleValue) = doubleValue
Run Code Online (Sandbox Code Playgroud)
现在,我想在图书清单上写一个累加器,例如
go :: Double -> Book -> Double
go acc book = acc + priceAsDouble (bookPrice book)
Run Code Online (Sandbox Code Playgroud)
哪个很好并且编译.
但是,如果我将最后一行更改为
go acc book = acc + priceAsDouble $ bookPrice book
Run Code Online (Sandbox Code Playgroud)
我得到以下矛盾的编译器错误:
<interactive>:10:51:
Couldn't match expected type ‘Price -> Double’
with actual type ‘Double’
The first argument of ($) takes one argument,
but its type …Run Code Online (Sandbox Code Playgroud)