Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何删除字符串中的重复字符?_Java_String - Fatal编程技术网

Java 如何删除字符串中的重复字符?

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

我有一个方法,应该从传递到其中的字符串中删除所有DUP。我可以打印DUP,如何删除原始字符串中的DUP?比如说,“迈阿密”在回归时必须是“米娅”。谢谢

  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?谢谢。您的代码不起作用(需要吗