我似乎遇到了一个奇怪的问题,即将文件读取到ArrayList
并从ArrayList
读取到TreeSet
比将文件直接添加到TreeSet
更快public TreeSet<String> readFile(){
TreeSet<String> dict = null;
try {
dict = new TreeSet<String>();
BufferedReader in = new BufferedReader(new InputStreamReader(getAssets().open("dictionary")));
String line;
while ((line = in.readLine()) != null) {
line = line.split(SEPARATOR)[0];
dict.add(line);
}
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return dict;
}
。我似乎无法理解这个问题。
public TreeSet<String> readFile(){
ArrayList<String> dict = null;
try {
dict = new ArrayList<String>();
BufferedReader in = new BufferedReader(new InputStreamReader(getAssets().open("dictionary")));
String line;
while ((line = in.readLine()) != null) {
line = line.split(SEPARATOR)[0];
dict.add(line);
}
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
TreeSet<String> tree = new TreeSet<String>();
for(String word:dict){
tree.add(word);
}
return tree;
}
此问题似乎与分离功能有关,因为它在没有它的情况下以正常速度工作 我的输入文件大约有160 000行 使用TreeSet的ArrayList大约需要2000毫秒 TreeSet大约需要100 000 ms。
ArrayList - &gt; TreeSet代码
{{1}}
目前使用带有Cyanogenmod的OnePlus One进行测试。
答案 0 :(得分:0)
TreeSet
使用在Comparable
上定义的String
,并会尝试排序n
次 - &gt;你要添加的字符串的大小。
ArrayList
只是按索引添加,并且没有任何后台操作在运行。
一旦达到所有TreeSet
,必须按照定义的规则进行排序。
在此定义:API
Costs guaranteed log(n) for basic operations
答案 1 :(得分:0)
我猜您正在阅读已经排序的文件。然后立即插入将倾向于创建一个线性列表,或者需要不断重新平衡树以防止这种情况。
TreeSet.addAll(Collection)
首先排序(对于排序列表相对较快),然后使用优化算法,知道元素已排序以构建(平衡)树。