Java 通过增加连续字符数来缩短字符串的表示形式

Java 通过增加连续字符数来缩短字符串的表示形式,java,string,Java,String,给定一个不包含(0-9)的随机字符串,我需要通过添加连续字符数来缩短该字符串的表示形式。例如:ggee将导致显示g2e2。 我设法实现了这个程序,并通过各种输入测试了它(工作正常)。我遇到了一个问题,在上面输入的情况下,我似乎无法理解字符“e”是如何显示的。 我已经多次跟踪我的代码,但是当“I”为2/3时,我看不到何时/如何显示“e” String输入=新字符串(“ggee”); 字符位置=输入字符(0); int累加器=1; 对于(int i=1;i1) { 系统输出打印(位置+“”+累加

给定一个不包含(0-9)的随机字符串,我需要通过添加连续字符数来缩短该字符串的表示形式。例如:ggee将导致显示g2e2。

我设法实现了这个程序,并通过各种输入测试了它(工作正常)。我遇到了一个问题,在上面输入的情况下,我似乎无法理解字符“e”是如何显示的。
我已经多次跟踪我的代码,但是当“I”为2/3时,我看不到何时/如何显示“e”

String输入=新字符串(“ggee”);
字符位置=输入字符(0);
int累加器=1;
对于(int i=1;i1)
{
系统输出打印(位置+“”+累加器);
}
其他的
{
系统输出打印(位置+“”);
}
位置=输入字符(i);
累加器=1;
if(lastIndexOfString)
System.out.print(input.charAt(i));//当
//我在字符串的最后一个索引处,
//甚至无视我的健康状况
//(位置==输入字符(i))
}
}

基本上,您希望每个字符不重复

*******************************************************************************/

public class Main
{
    public static void main(String[] args) {
    String s="ggggggeee";
        StringBuilder s1=new 
         StringBuilder("") ;
           ;




       for(int i=0;i<s.length();i++)
      {
     int count=0,j;
        for( j=i+1;j<s.length();j++)
        {
       if(s.charAt(i)==s.charAt(j))
       count++;
       else 
         {
             break;}
        } 
        i=j-1;
     s1=s1.append(s.charAt(i)+""+(count+1));


       } 

       System.out.print(s1);



}}
*******************************************************************************/
公共班机
{
公共静态void main(字符串[]args){
字符串s=“gggg-eee”;
StringBuilder s1=新建
StringBuilder(“”);
;

对于Java 9+中的(int i=0;i,使用正则表达式查找连续字符,以下操作将完成此操作:

static String shorten(String input) {
    return Pattern.compile("(.)\\1+").matcher(input)
            .replaceAll(r -> r.group(1) + r.group().length());
}
试验

System.out.println(缩写(“ggggecaaaaaaaaaaaaaaaaaaa”);

System.out.println(shorten(“ggggee”我需要缩短…例如:
ggee
将导致显示
g2e2
)--这是相同的长度,即不更短。我理解,但为了简单起见,我给出了这个示例。如果我有例如:ggggee,这将导致g4e2。在Java 9+中,以下操作将完成:
System.out.print(Pattern.compile(“()\\1+”).matcher(input).replaceAll(r->r.group(1)+r.group().length());
——例如input
“ggggecaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
prints
g4e2ca12
非常感谢您提供了这个令人大开眼界的解决方案。我以后会使用它。但是,我仍然想让我的解决方案发挥作用。您需要完全重新思考您试图做的事情。例如,
lastIndexOfString
是完全错误的,因为将当前字符与最后一个字符进行比较意味着什么?没什么!---想想输入
“aabbbaabbaaaa”
。为什么第一个字符和最后一个字符一样重要?为什么中间的3个
a
字符中的任何一个都和最后一个字符一样重要?---后退一步,重新思考,然后再试一次。有很大缺陷。不编译(18个错误)。即使修复了编译错误,结果也是错误的。错误结果的想法并不是真的有用。编辑。现在检查,
c1
?目标是缩短字符串,而不是使其变长。现在不要操作,因为如果计数大于1,也会考虑到这一点。较高的声誉并不意味着您应该避免看到逻辑本身如果在投反对票之前更好,也应该在评论中说明,为了更简单的逻辑,最好避免使用已经内置的方法来解决。因为这可能不是标准的。对于如此高的声誉,我们期望this@HimanshuAhuja 1)对于更简单的逻辑,我们肯定应该使用已经内置的方法,而不是重写已经编写的逻辑。这使得我们的代码,即我们正在编写的新代码,更加简单。--2“这可能不是标准的”什么可能不是标准的?这个答案只使用标准的Java API。我预先指定了它需要Java 9+。因为问题没有指定Java版本的限制,所以这是一个完全有效的答案。我说,对于基本问题,导入一个额外的包及其名为的方法看起来就像是在没有逻辑的情况下解决问题,需要导入开销。这些类型的问题与任何真正的企业问题无关,而是测试基本逻辑的测试问题。OP根本不会想到用实际的方式来解决它。@HimanshuAhuja“似乎没有逻辑就解决问题”使用可用的工具就是用逻辑解决问题。不使用可用的工具是不合逻辑的“有导入的开销”导入没有开销。--“基本上不会有用实际方法解决它的想法”这段代码是解决问题的“实际”方法。
static String shorten(String input) {
    return Pattern.compile("(.)\\1+").matcher(input)
            .replaceAll(r -> r.group(1) + r.group().length());
}