Java 如何删除字符串中的重复字符?
我有一个方法,应该从传递到其中的字符串中删除所有DUP。我可以打印DUP,如何删除原始字符串中的DUP?比如说,“迈阿密”在回归时必须是“米娅”。谢谢Java 如何删除字符串中的重复字符?,java,string,Java,String,我有一个方法,应该从传递到其中的字符串中删除所有DUP。我可以打印DUP,如何删除原始字符串中的DUP?比如说,“迈阿密”在回归时必须是“米娅”。谢谢 public static String removeDups( String str1){ char[] str = str1.toCharArray(); if (str == null) return null; int len = str.length; if (len
public static String removeDups( String str1){
char[] str = str1.toCharArray();
if (str == null) return null;
int len = str.length;
if (len < 2) return new String(str);
char[] newStr = new char[len+1];
int copyLength = 0;
for ( int i = 1 ; i < len; i++){
for( int j=0; j< i; j++){
if ( str[i] == str[j]){
System.out.println(" str[i] == str[j] = "+ str[i] + " , "+str[j]);
break;
}
}
}
return new String(str);
}
publicstaticstringremovedups(stringstr1){
char[]str=str1.toCharArray();
if(str==null)返回null;
int len=str.length;
if(len<2)返回新字符串(str);
char[]newStr=新字符[len+1];
int copyLength=0;
对于(int i=1;i
您的循环似乎有点奇怪
char[] str = str1.toCharArray();
int len = str.length;
if (str == null || len < 2) return null;
char[] newStr = new char[len+1];
int newStrLength = 0;
for( int i = 1; i < len; i++ ){ //Iterate complete string
for( int j=0; j < i; j++ ){ //Iterate the already-finished part
if( str[i] == str[j] )
break;
}
newStr[newStrLength++] = str[i];
}
}
newStr[newStrLength] = 0;
char[]str=str1.toCharArray();
int len=str.length;
if(str==null | | len<2)返回null;
char[]newStr=新字符[len+1];
int newStrLength=0;
对于(int i=1;i
在本例中,我创建了一个全新的字符串,并且不更改原始字符串。它使代码更清晰易读
或者,你可以看看这个,它有一些更有效的答案。你的循环似乎有点奇怪
char[] str = str1.toCharArray();
int len = str.length;
if (str == null || len < 2) return null;
char[] newStr = new char[len+1];
int newStrLength = 0;
for( int i = 1; i < len; i++ ){ //Iterate complete string
for( int j=0; j < i; j++ ){ //Iterate the already-finished part
if( str[i] == str[j] )
break;
}
newStr[newStrLength++] = str[i];
}
}
newStr[newStrLength] = 0;
char[]str=str1.toCharArray();
int len=str.length;
if(str==null | | len<2)返回null;
char[]newStr=新字符[len+1];
int newStrLength=0;
对于(int i=1;i
在本例中,我创建了一个全新的字符串,并且不更改原始字符串。它使代码更清晰易读
或者,你可以看看这个,它有一些更有效的答案。我发现使用
StringBuilder
比使用字符串更容易
编辑
这也可以通过组合使用StringBuilder
和regex
正则表达式模式分解:
(.) --> matches any character and puts in group 1.
?= --> this is called a positive lookahead.
?=.*\\1 --> positive lookahead of zero or more characters for the first group
代码示例:
public static void main(String[] args) throws Exception {
System.out.println(removeDuplicates("miamimiamimiami"));
System.out.println(removeDuplicatesRegex("miamimiamimiami"));
}
public static String removeDuplicates(String input){
StringBuilder data = new StringBuilder(input);
for (int i = 0; i < data.length(); i++) {
String character = String.valueOf(data.charAt(i));
int dupIndex = data.indexOf(character, i + 1);
while (dupIndex != -1) {
data.deleteCharAt(dupIndex);
dupIndex = data.indexOf(character, i + 1);
}
}
return data.toString();
}
public static String removeDuplicatesRegex(String input) {
return new StringBuilder(
new StringBuilder(input)
.reverse()
.toString()
.replaceAll("(.)(?=.*\\1)", ""))
.reverse().toString();
}
我发现使用StringBuilder
比使用String
编辑
这也可以通过组合使用StringBuilder
和regex
正则表达式模式分解:
(.) --> matches any character and puts in group 1.
?= --> this is called a positive lookahead.
?=.*\\1 --> positive lookahead of zero or more characters for the first group
代码示例:
public static void main(String[] args) throws Exception {
System.out.println(removeDuplicates("miamimiamimiami"));
System.out.println(removeDuplicatesRegex("miamimiamimiami"));
}
public static String removeDuplicates(String input){
StringBuilder data = new StringBuilder(input);
for (int i = 0; i < data.length(); i++) {
String character = String.valueOf(data.charAt(i));
int dupIndex = data.indexOf(character, i + 1);
while (dupIndex != -1) {
data.deleteCharAt(dupIndex);
dupIndex = data.indexOf(character, i + 1);
}
}
return data.toString();
}
public static String removeDuplicatesRegex(String input) {
return new StringBuilder(
new StringBuilder(input)
.reverse()
.toString()
.replaceAll("(.)(?=.*\\1)", ""))
.reverse().toString();
}
还有一个选择:
StringBuffer buf = new StringBuffer( originalString);
int len = str.length();
for (int i = 0; i < len; i++) {
char c = buf.charAt( i );
for (int j = len - 1; j > i; j--) {
if ( buf.charAt( j ) == c ) {
buf.deleteCharAt( j );
len--;
}
}
}
StringBuffer buf=新的StringBuffer(originalString);
int len=str.length();
对于(int i=0;ii;j--){
if(基本特征(j)=c){
buf.deleteCharAt(j);
蓝--;
}
}
}
这里是另一个选项:
StringBuffer buf = new StringBuffer( originalString);
int len = str.length();
for (int i = 0; i < len; i++) {
char c = buf.charAt( i );
for (int j = len - 1; j > i; j--) {
if ( buf.charAt( j ) == c ) {
buf.deleteCharAt( j );
len--;
}
}
}
StringBuffer buf=新的StringBuffer(originalString);
int len=str.length();
对于(int i=0;ii;j--){
if(基本特征(j)=c){
buf.deleteCharAt(j);
蓝--;
}
}
}
删除字符串中的所有重复字符:
public static String removeDuplicates(String str1) {
if (str1 == null)
return null;
char[] str = str1.toCharArray();
int len = str.length;
if (len < 2)
return str1;
char temp = str[0];
for (int i = 1; i < len; i++) {
if (temp != 0)
for (int j = i; j < len; j++)
if (temp == str[j])
str[j] = 0;
temp = str[i];
}
int i = 0;
char[] str2 = new char[len];
for (char c : str)
if (c != 0)
str2[i++] = c;
return (new String(str2)).trim();
}
publicstaticstringremovedupplicates(stringstr1){
如果(str1==null)
返回null;
char[]str=str1.toCharArray();
int len=str.length;
if(len<2)
返回str1;
char temp=str[0];
对于(int i=1;i
删除字符串中的所有重复字符:
public static String removeDuplicates(String str1) {
if (str1 == null)
return null;
char[] str = str1.toCharArray();
int len = str.length;
if (len < 2)
return str1;
char temp = str[0];
for (int i = 1; i < len; i++) {
if (temp != 0)
for (int j = i; j < len; j++)
if (temp == str[j])
str[j] = 0;
temp = str[i];
}
int i = 0;
char[] str2 = new char[len];
for (char c : str)
if (c != 0)
str2[i++] = c;
return (new String(str2)).trim();
}
publicstaticstringremovedupplicates(stringstr1){
如果(str1==null)
返回null;
char[]str=str1.toCharArray();
int len=str.length;
if(len<2)
返回str1;
char temp=str[0];
对于(int i=1;i
您还可以使用Arraylist存储唯一字符:
public static String removeDups( String str1){
ArrayList<Character> set=new ArrayList<Character>();
char[] str=str1.toCharArray();
for(int i=0;i<str.length;i++)
{
if(!set.contains(str[i])){
set.add(str[i]);
}
}
for(char e:set)
{
System.out.print(e);
}
}
publicstaticstringremovedups(stringstr1){
ArrayList集合=新的ArrayList();
char[]str=str1.toCharArray();
对于(int i=0;i您还可以使用Arraylist存储唯一字符:
public static String removeDups( String str1){
ArrayList<Character> set=new ArrayList<Character>();
char[] str=str1.toCharArray();
for(int i=0;i<str.length;i++)
{
if(!set.contains(str[i])){
set.add(str[i]);
}
}
for(char e:set)
{
System.out.print(e);
}
}
publicstaticstringremovedups(stringstr1){
ArrayList集合=新的ArrayList();
char[]str=str1.toCharArray();
对于(inti=0;idupplicate)问题,不需要转换为char数组,使用“charAt”索引stringA快速注释-您的j循环应该从“i”开始不是0,例如j=I;这样它就不会在前面的字符上循环。可能是重复的我猜它可以在n^2时间内运行?重复问题没有必要转换为字符数组,使用“charAt”索引字符串快速注释-您的j循环应该从“I”开始不是0,例如j=I;这样它就不会在前面的字符上循环。可能是重复的我猜它可以在n^2时间内运行吗?您的代码不工作(我需要假定什么是复制的吗?)。我稍微更改了方法(参见问题)并且可以打印DUP。如何删除原始字符串中的DUP?谢谢。您的代码不起作用(需要吗