0

我使用以下代码将字符串写入我的简单文本文件:

编辑:

private String fileLocation="/mnt/sdcard/out.txt";

public void saveHisToFile()
{
    if (prefs.getBoolean("saveHis", true) && mWordHis != null && mWordHis.size() >= 1)
    {
        StringBuilder sbHis = new StringBuilder();          
        Set<String> wordSet= new HashSet<String>(mWordHis);
        for (String item : wordSet)
        {
            sbHis.append(item);
            sbHis.append("\n");
        }

        String strHis = sbHis.substring(0, sbHis.length()-1);  
        try {
             BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
                     fileLocation), true));
             bw.write(strHis);
             bw.newLine();
             bw.close();
        } catch (IOException e) {

        }
    }
}

字符串成功写入文本文件,但奇怪的是,有些字符串被覆盖了,例如:

apple
orange
grapes
grapes
grapes
apple 
kiwi

我的问题是:

  1. 如何停止多次写入字符串?
  2. 如果文件中已经存在字符串(一行),如何停止将其写入文件?

我已经查阅了这篇文章,但未能将其应用于我的案例。你能帮忙吗?提前非常感谢。

4

4 回答 4

3

试试这个:

public void saveHisToFile(Set<String> existingWords)
{
    if (prefs.getBoolean("saveHis", true) && mWordHis != null && mWordHis.size() >= 1)
    {
        StringBuilder sbHis = new StringBuilder();
        for (String item : mWordHis)
        {
            if (!existingWords.contains(item)) {
                sbHis.append(item);
                sbHis.append("\n");
            }
        }

        String strHis = sbHis.substring(0, sbHis.length()-1);
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
                    fileLocation), true));
            bw.write(strHis);
            bw.newLine();
            bw.close();
        } catch (IOException e) {

        }
    }
}
于 2013-05-27T08:45:35.663 回答
2

我猜mWordHis是 a List,它可以包含重复的条目。您可以先将其转换为 a Set(不允许重复)并仅打印Set.

    Set<String> wordSet= new HashSet<>(mWordHis);

    for (String item : wordSet)
    {
        sbHis.append(item);
        sbHis.append("\n");
    }

正如@fge 评论的那样,LinkedHashSet如果插入顺序很重要,也可以使用。

如果您需要对同一个文件多次运行相同的代码,则必须将已写入文件的所有记录保存在内存中,或者在写入文件之前读取文件并获取所有数据。

编辑:

我只能考虑修剪单词,因为有些可能包含不需要的空格:

    Set<String> wordSet= new HashSet<>();
    for (String item : mWordHis){
        wordSet.add(item.trim());
    }
于 2013-05-27T08:45:07.463 回答
1

您可以将所有字符串添加到 HashMap 中,并检查每个新字符串是否已经存在。

例子:

    HashMap<String,String> test = new HashMap<String,String>();
    if(!test.containsKey(item)) {
      test.put(item,"");
      // your processing: example
      System.out.println(item);
    } else {
      // Your processing of duplicates, example:
      System.out.println("Found duplicate of: " + item);
    }

编辑:或使用其他解决方案所示的 HashSet ...

    HashSet<String> test = new HashSet<String>();
    if(!test.contains(item)) {
      test.add(item);
      // your processing: example
      System.out.println(item);
    } else {
      // Your processing of duplicates, example:
      System.out.println("Found duplicate of: " + item);
    }

编辑2:

    private String fileLocation="/mnt/sdcard/out.txt";

    public void saveHisToFile()
    {
        if (prefs.getBoolean("saveHis", true) && mWordHis != null && mWordHis.size() >= 1)
        {
            StringBuilder sbHis = new StringBuilder();  
            HashSet<String> test = new HashSet<String>();

            Set<String> wordSet= new HashSet<String>(mWordHis);
            for (String item : wordSet)
            {
                if(!test.contains(item)) {
                    test.add(item);
                    // your processing: example
                    sbHis.append(item+System.lineSeparator());
                } else {
                    // Your processing of duplicates, example:
                    //System.out.println("Found duplicate of: " + item);
                }
            }

            String strHis = sbHis.toString();  
            try {
                 BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
                         fileLocation), true));
                 bw.write(strHis);
                 bw.newLine();
                 bw.close();
            } catch (IOException e) {

            }
        }
    }
于 2013-05-27T08:49:28.587 回答
1

这是有关如何解决您的问题的完整示例:

      import java.io.BufferedReader;
      import java.io.BufferedWriter;
      import java.io.File;
      import java.io.FileReader;
      import java.io.FileWriter;
      import java.io.IOException;
      import java.util.HashSet;

      public class HisSaver {
        private HashSet<String> uniqueTester = new HashSet<String>();

        private String fileLocation="/mnt/sdcard/out.txt";

        private static HisSaver instance = null;


        private HisSaver() {
            readWordsFromFile();
        }

        public static HisSaver getInstance() {
            if(instance == null)
                instance = new HisSaver();
            return instance;
        }

        public void saveWord(String word) {
            if(!uniqueTester.contains(word)) {
                uniqueTester.add(word);
                writeWordToFile(word);
            }
        }

        private void writeWordToFile(String word) {
          try {
               BufferedWriter bw = new BufferedWriter(new FileWriter(new File(
                       fileLocation), true));
               bw.write(word);
               bw.newLine();
               bw.close();
          } catch (IOException e) {

          }
        }

        private void readWordsFromFile() {
          try {
            BufferedReader br = new BufferedReader(new FileReader(new File(
                fileLocation)));
            String line;
            while((line = br.readLine()) != null) {
                if(!uniqueTester.contains(line)) {
                    uniqueTester.add(line);
                }
            }
          } catch (IOException e) {

          }
        }
      }

现在要使用它,您只需在代码中执行以下操作:

    HisSaver hs = HisSaver.getInstance();
    hs.saveWord("newWord");

当且仅当它不在您的文件中时,这将插入“newWord”,前提是您的代码中没有其他函数访问此文件。请注意:此解决方案不是线程安全的!!!

编辑:解释代码的作用:我们创建了一个单例类 HisSaver。这是通过将其构造函数设为私有并提供一个静态方法 getInstance() 来实现的,该方法返回一个初始化的 HisSaver。这个 HisSaver 将已经包含您文件中所有预先存在的单词,因此只会将新单词附加到它。从另一个类调用 getInstance() 方法将为您提供此单例的句柄,并允许您调用 saveWord 而不必担心您手中是否有正确的对象,因为只能实例化它的一个实例。

于 2013-05-27T11:45:55.270 回答