如何防止在内部存储中存储重复的字符串

时间:2017-03-24 09:03:32

标签: java android android-studio storage internal

我从两天开始尝试但没有成功。我正在片段的onStop方法中将arraylist保存在内部存储中,然后在onresume方法中从内部存储中获取此数据。我正在检查字符串是否存在于interanlly存储的arraylist中以防止在内部存储中存储重复的字符串,但这似乎不起作用。它每次都在内部存储中存储重复的字符串。我不明白我在这里做错了什么。我将非常感谢你的帮助。

 public void saveTitleList (){
    try {
        FileOutputStream fileOutputStream= mContext.openFileOutput("radiotitle2.txt",MODE_PRIVATE);
        DataOutputStream dataOutputStream=new DataOutputStream(fileOutputStream);
        dataOutputStream.writeInt(stationName2.size());
        ArrayList<String> titletest=getTitleList();
        for(String line:stationName2){
            if(!titletest.contains(line)){//here i am checking for duplicate strings in intenal file
                dataOutputStream.writeUTF(line);
                Log.d("title2 saved",line);
            }

        }
        dataOutputStream.flush();
        dataOutputStream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public ArrayList<String> getTitleList(){
    ArrayList<String> titleList= new ArrayList<>();
    try {
        FileInputStream fileInputStream= mContext.openFileInput("radiotitle2.txt");
        DataInputStream dataInputStream= new DataInputStream(fileInputStream);
        int size=dataInputStream.readInt();
        for(int i =0;i<size;i++){
            String line=dataInputStream.readUTF();
            titleList.add(line);
            Log.d("title2 from storage",line);
        }
        dataInputStream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return titleList;
}

3 个答案:

答案 0 :(得分:2)

ArrayList 允许重复,而 HashSet 不允许重复 。 您应该使用 HashSet

  

Set界面的重要特征是它不允许   重复的元素;存储独特的元素。

 HashSet <String> titleList= new HashSet <String>();

    try {
    FileInputStream fileInputStream= mContext.openFileInput("radiotitle2.txt");
    DataInputStream dataInputStream= new DataInputStream(fileInputStream);
    int size=dataInputStream.readInt();
    for(int i =0;i<size;i++){
        String line=dataInputStream.readUTF();
        titleList.add(line);
        Log.d("title2 from storage",line);
    }
   ......

答案 1 :(得分:0)

您刚刚开始在saveTitleList中写入文件,然后直接从调用getTitleList的同一文件中读取。

该文件为空,然后为一个int执行。

所以你搞得一团糟。

你的代码中会有什么样的逻辑?

答案 2 :(得分:0)

首先,要检查重复项目,您应该使用Set / HashSet。 Arraylist contains方法将搜索O(n)中的每个String,以检查它是否存在。

你应该这样做的方法是定义一个hashSet,并开始向它添加字符串。务必检查字符串是否确实存在。如果它存在则不添加,否则将其添加到hashset。

此外,如果您想保存此数据,以便在您的活动/片段死亡时它可能会持续存在,请将其保存在onSaveInstance方法中。