在字符串中删除重复的字符

3
我需要编写一个静态方法,它以一个字符串作为参数,并返回一个新的字符串,该字符串通过替换每个重复相邻字母的实例而获得,但不使用正则表达式。例如,如果我输入“maaaakkee”作为字符串,则返回“make”。 我已经尝试了以下代码,但似乎没有显示最后一个字符。 这是我的代码:
import java.util.Scanner;
public class undouble {
    public static void main(String [] args){
        Scanner console = new Scanner(System.in);
        System.out.println("enter String: ");
        String str = console.nextLine();
        System.out.println(removeSpaces(str));
    }
public static String removeSpaces(String str){
    String ourString="";
    int j = 0;
    for (int i=0; i<str.length()-1 ; i++){
        j = i+1;
        if(str.charAt(i)!=str.charAt(j)){
            ourString+=str.charAt(i);
        }

    }

    return ourString;
    }
}

尝试使用正则表达式。 - lavrik
str.charAt(i)!=str.charAt(j) 怎么可能是真的? - Noel Yap
@lavrik 由于这似乎是入门级的内容,我怀疑提问者不知道如何使用正则表达式... - ryanlutgen
即使问题中的第一个字母出现在四个单词中,但它仍然大写,这表明这是从课程作业中复制并粘贴的事实。 - Ross Drew
@Vizkos 这可能是开始学习的原因 :) - lavrik
13个回答

0
问题出在你的条件上。你在每次迭代中比较 i 和 i+1,在最后一次迭代中,i 和 j 指向同一个位置,所以永远不会打印出最后一个字符。除非你想使用正则表达式来实现这个功能,否则尝试这样做:
编辑:
public  void removeSpaces(String str){
        String ourString="";
        for (int i=0; i<str.length()-1 ; i++){
            if(i==0){
                ourString = ""+str.charAt(i);
            }else{
                if(str.charAt(i-1) != str.charAt(i)){
                    ourString = ourString +str.charAt(i);
                }
            }           
        }
        System.out.println(ourString);
    }

最好的方法是使用 StringBuilder。在字符串末尾添加字符串 str = string + end 比添加到 StringBuilder 中要慢得多。https://dev59.com/vW445IYBdhLWcg3wM3bx - Tillson

-1

Java 7更有趣:

System.out.println("11223344445555".replaceAll("(?<nums>.+)\\k<nums>+","${nums}"));

正则表达式中不再有晦涩的数字。


OP说,“不使用正则表达式”,所以这个解决方案并不是问题的答案。除此之外,这个解决方案是错误的,因为它会将“nonono”替换为“no”。 - Chriki

-2

公共静态字符串 removeDuplicates(String str) {

    String str2 = "" + str.charAt(0);
    for (int i = 1; i < str.length(); i++) {
        if (str.charAt(i - 1) == str.charAt(i) && i != 0) {
            continue;
        }
        str2 = str2 + str.charAt(i);
    }
    return str2;
}

1
这个解决方案不正确。它不仅仅删除重复的“相邻”字符。例如,“meeeekeee”变成“mek”。 - Chriki
你能详细解释一下你为什么觉得这是一个好答案,并且可能解释一下这个提议的解决方案在做什么吗? - Ro Yo Mi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接