读取TreeSet的奇怪问题

时间:2014-09-09 13:45:00

标签: java android cyanogenmod

我似乎遇到了一个奇怪的问题,即将文件读取到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进行测试。

2 个答案:

答案 0 :(得分:0)

TreeSet使用在Comparable上定义的String,并会尝试排序n次 - &gt;你要添加的字符串的大小。

ArrayList只是按索引添加,并且没有任何后台操作在运行。

一旦达到所有TreeSet,必须按照定义的规则进行排序。

在此定义:API

Costs guaranteed log(n) for basic operations

答案 1 :(得分:0)

我猜您正在阅读已经排序的文件。然后立即插入将倾向于创建一个线性列表,或者需要不断重新平衡树以防止这种情况。

TreeSet.addAll(Collection)首先排序(对于排序列表相对较快),然后使用优化算法,知道元素已排序以构建(平衡)树。