stringbuilder去重(string 去重)
JAVA合并两个文件并去重
先做一个buffer:
StringBuilder sb_a = new StringBuilder(); // for a
StringBuilder sb_b = new StringBuilder(); // for b
然後读文件:
Path aFile = Paths.get("a.txt");
try (BufferedReader reader = Files.newBufferedReader( aFile, Charset.defaultCharset())) {
String lineFromFile = "";
while((lineFromFile = reader.readLine()) != null){
sb_a.append(lineFromFile);
}
} catch(IOException exception) {
System.out.println("Error while reading file");
}
b.txt也是同一个方法
跟著以你自定义的方法去比较两个怎样合拼,暂存为String merged = ...;
最後写回文件:
Path abFile = Paths.get("ab.txt");
try (BufferedWriter writer = Files.newBufferedWriter( abFile, Charset.defaultCharset())) {
writer.append(merged);
writer.newLine(); // optional
writer.flush();
} catch(IOException exception) {
System.out.println("Error writing to file");
}
(算法)去除字符串中的重复字符(时间复杂度)
1.一般会想到遍历字符串,去除重复的字符,这样时间复杂度是O(n2),时间复杂度太高。
static String sub(String str){
StringBuffer result =newStringBuffer();
List list =new ArrayList();
char[] cs = str.toCharArray();
for(int i=0; ics.length; i++){
if(!list.contains(cs[i])){
result.append(cs[i]);
list.add(cs[i]);
}
}
returnresult.toString();
}
2.再仔细想一想
用java的String的indexOf方法来达到字符串去重的目的,indexOf的功能是返回指定字符在此字符串中第一次出现处的索引:
public static String QuChong(String str){
? ? ? ? StringBuilder sb=new StringBuilder();
? ? ? ? for(int i=0;istr.length();i++){
? ? ? ? ? ? if(str.indexOf(str.charAt(i))==i){
? ? ? ? ? ? ? ? //第一次出现
? ? ? ? ? ? ? ? sb.append(str.charAt(i));
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? String result=sb.toString();
? ? ? ? return result;
? ? }
Java 字符串去重
public?class?Demo8?{
?public?static?void?main(String[]?args)?{?
????????System.out.println(removerepeatedchar("ddddccffgd"));?
????}?
????public?static?String?removerepeatedchar(String?s)?{?
????????if?(s?==?null)?
????????????return?s;?
????????StringBuilder?sb?=?new?StringBuilder();?
????????int?i?=?0,?len?=?s.length();?
????????while?(i??len)?{?
????????????char?c?=?s.charAt(i);?
????????????sb.append(c);?
????????????i++;?
????????????while?(i??len??s.charAt(i)?==?c)?{?
????????????????i++;?
????????????}?
????????}?
????????return?sb.toString();?
????}?
}
StringBuilder为什么线程不安全?
核心提示:在前面的面试题讲解中我们对比了String、StringBuilder和StringBuffer的区别,其中一项便提到StringBuilder是非线程安全的,那么是什么原因导致了StringBuilder的线程不安全呢?原因分析如果你看了StringBuilder或StringBuffer的源代码会说,因为StringBuilder在append操作时并未使用线程同步,而StringBuffer几乎大部分方法都使用了synchronized关键字进行方法级别的同步处理。上面这种说法肯定是正确的,对照
在前面的面试题讲解中我们对比了String、StringBuilder和StringBuffer的区别,其中一项便提到StringBuilder是非线程安全的,那么是什么原因导致了StringBuilder的线程不安全呢?
原因分析
如果你看了StringBuilder或StringBuffer的源代码会说,因为StringBuilder在append操作时并未使用线程同步,而StringBuffer几乎大部分方法都使用了synchronized关键字进行方法级别的同步处理。
上面这种说法肯定是正确的,对照一下StringBuilder和StringBuffer的部分源代码也能够看出来。
StringBuilder的append方法源代码:
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuffer的append方法源代码:
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}