Java 对树集阅读的奇怪问题

Java 对树集阅读的奇怪问题,java,android,cyanogenmod,Java,Android,Cyanogenmod,我似乎遇到了一个奇怪的问题,将文件读入ArrayList并从该ArrayList读入TreeSet比直接将数据添加到TreeSet更快。我似乎不明白这个问题 public TreeSet<String> readFile(){ TreeSet<String> dict = null; try { dict = new TreeSet<String>(); BufferedReader in = new Buffe

我似乎遇到了一个奇怪的问题,将文件读入
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 readFile(){
TreeSet dict=null;
试一试{
dict=新树集();
BufferedReader in=新的BufferedReader(新的InputStreamReader(getAssets().open(“dictionary”));
弦线;
而((line=in.readLine())!=null){
行=行分割(分隔符)[0];
dict.add(行);
}
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回命令;
}
此外,这个问题似乎与分割功能有关,因为它在没有分割功能的情况下以正常速度工作。
我的输入文件大约有160000行。
带TreeSet的ArrayList大约需要2000毫秒。
TreeSet大约需要10万毫秒

ArrayList->TreeSet代码

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;
}
public TreeSet readFile(){
ArrayList dict=null;
试一试{
dict=newarraylist();
BufferedReader in=新的BufferedReader(新的InputStreamReader(getAssets().open(“dictionary”));
弦线;
而((line=in.readLine())!=null){
行=行分割(分隔符)[0];
dict.add(行);
}
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
树集树=新树集();
for(字符串字:dict){
tree.add(word);
}
回归树;
}

目前使用带氰莫德的OnePlus One进行测试。

TreeSet
使用在
字符串上定义的
可比
,并尝试对要添加的字符串进行排序
n
乘以-->大小

ArrayList
只是按照索引添加,没有任何后台操作运行

当它到达all
TreeSet
时,必须按照定义的规则进行排序

定义如下:


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


TreeSet.addAll(Collection)
。您只需要获取拆分将生成的整个数组的第一个元素。是的,“line=line.substring(0,line.indexOf(“:”);”也更快,但我试图理解为什么拆分会更慢,但只有使用TreeSet才能发布代码,说明如何准确地将数据从ArrayList移动到TreeSet。此外,拆分(分隔符)也是冗余的。使用拆分(分隔符,1)以获得最佳效果。树集执行排序时自然较慢。但这并不能解释ArrayList+TreeSet组合输出。limit似乎也能让它更快、更有效normal@Opetion如何将数据从ArrayList传递到TreeSet?但这并不能解释为什么ArrayList+TreeSet组合会以正常速度工作,是吗?好的,我理解,但是将所有内容放在arraylist上然后放在treeset中更快,这有意义吗?@Jitsu将
String
添加到循环中的treeset与将它们添加到arraylist之间的区别。这对执行有什么影响吗?这与组合无关。@Operation如果您需要更快的执行速度,并且不想打破遵循
Set
原则的契约,为什么不呢?@VinayVeluri OP的一个问题是为什么TreeSet达到100000毫秒,而添加到ArrayList然后添加到TreeSet则更快,这一点起初是不合逻辑的。这就是我想回答的。是的,文件已经排序了。但是,既然我只是在foreach循环arraylist并添加每个字符串,那么它仍然有意义吗?这是编译器的优化吗?不,对不起,我没有看到。树集合中的插入需要更长的时间,并且使用更多的内存,可能与读取相结合,它们会导致读取在读取或总内存消耗时结巴。
Costs guaranteed log(n) for basic operations