我使用以下代码将字符串写入我的简单文本文件:
编辑:
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
我的问题是:
我咨询过this post但未能将其应用于我的案例。你能帮我个忙吗?非常感谢提前。
答案 0 :(得分: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) {
}
}
}
答案 1 :(得分:2)
我猜mWordHis
是List
,可以包含重复的条目。
您可以先将其转换为Set
(不允许重复)并仅打印Set
中的字词。
Set<String> wordSet= new HashSet<>(mWordHis);
for (String item : wordSet)
{
sbHis.append(item);
sbHis.append("\n");
}
正如@fge评论的那样,如果广告订单很重要,也可以使用LinkedHashSet
。
如果需要使用相同的文件多次运行相同的代码,则必须将已写入文件的所有记录保存在内存中,或者在写入文件之前获取所有数据。< / p>
编辑:
我只能考虑修剪单词,因为有些可能包含不需要的空格:
Set<String> wordSet= new HashSet<>();
for (String item : mWordHis){
wordSet.add(item.trim());
}
答案 2 :(得分: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);
}
Edit2:
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) {
}
}
}
答案 3 :(得分: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类。这是通过使它的构造函数私有并提供一个返回初始化的HisSaver的静态方法getInstance()来实现的。此HisSaver已经包含文件中所有预先存在的单词,因此只会在其中添加新单词。从另一个类调用getInstance()方法将为您提供此单例的句柄,并允许您调用saveWord,而不必担心您手中是否有正确的对象,因为只能实例化它的一个实例。