如何确保仅在字符不同时才执行Print语句?

时间:2019-04-09 03:12:51

标签: java string

所以,我正在编写一个用于String压缩的程序。如果输入为aabbccc,则输出应为a2b2c3

但是在我的程序中,我的输出是a2a2b2b2c3c3c3。那是因为我的Print语句在for循环中。不应该在那里。

仅当字符串中的两个字符不相等时,才能执行打印语句吗?这样我才能得到正确的输出?

我尝试了其他方法来执行String Compression程序,但是这种使用Collections的方法对我来说似乎最简单。

public class Compress {

   static int i;
   static int freq;

public static void main(String args[]) {
  System.out.println("Enter a String");
  Scanner sc= new Scanner(System.in);
  String  str=sc.nextLine();
   List<Character> arrlist = new ArrayList<Character>();
   for(int i=0; i<str.length();i++){
       arrlist.add(str.charAt(i));
   }
   for(int i=0; i<str.length();i++){
       freq = Collections.frequency(arrlist, str.charAt(i));
           System.out.print(str.charAt(i)+""+freq);
   }
 }
}

所需结果

Input: aabbccc
Output: a2b2c3

我要得到的东西

Input: aabbccc
Output: a2a2b2b2c3c3c3

3 个答案:

答案 0 :(得分:2)

您可以使用以下代码,无需进行2个嵌套循环即可进行压缩。一个循环通过输入字符串是绰绰有余的。

class Compress {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Enter a string: ");
    String inputString = scanner.nextLine();
    scanner.close();
    System.out.println("Compressed Input: " + compressInput(inputString));
  }

  private static String compressInput(String str) {
    if(str.isEmpty())
        return "";
    if(str.length() == 1)
        return str + "1";

    StringBuilder result = new StringBuilder();
    int cmpt = 1;
    for (int i = 1; i < str.length(); i++) {
      if(str.charAt(i - 1) == str.charAt(i))
          cmpt++;
      else {
          result.append(str.charAt(i-1));
          result.append(cmpt);
          cmpt=1;
      }
    } 
    result.append(str.charAt(str.length()-1));
    result.append(cmpt);
    return result.toString();
  }

}

输出示例

Enter a string: aaabbbbccddddeeeefg
Compressed Input: a3b4c2d4e4f1g1

答案 1 :(得分:1)

SELECT J.ID, S.LastServiceDate N.NextServiceDate FROM JOB AS J LEFT JOIN cteLastService AS S ON J.ID = S.JOB_ID LEFT JOIN cteNextService AS N ON J.ID = N.ID +----------------------------------------+ | ID | LastServiceDate | NextServiceDate | +----|-----------------|-----------------+ | 1 | 2019-03-24 | 2019-03-31 | | 2 | 2019-03-26 | 2019-04-02 | | 3 | 2019-03-24 | 2019-03-26 | | 4 | 2019-03-26 | 2019-04-01 | | 5 | 2019-03-24 | 2019-04-07 | | 6 | 2019-03-26 | 2019-04-09 | | 7 | 2019-03-24 | 2019-04-02 | | 8 | 2019-03-26 | 2019-04-08 | +----+-----------------+-----------------+ 确实为您提供了计数,如您在输出中看到的那样,但是这里的问题是您需要按字符串中的每个字符进行分组。

使用地图:

Collections.frequency

答案 2 :(得分:0)

您也可以按照以下类似方式进行操作。我使用了一个映射,其中的键是字符,值是出现的频率。

public class Compress {

    static int i;
    static int freq;

    public static void main(String args[]) {
        System.out.println("Enter a String");
        Scanner sc = new Scanner(System.in);
        HashMap<Character, Integer> hmap = new HashMap<>();
        String str = sc.nextLine();
        List<Character> arrlist = new ArrayList<Character>();
        for (int i = 0; i < str.length(); i++) {
            arrlist.add(str.charAt(i));
        }
        for (int i = 0; i < str.length(); i++) {
            freq = Collections.frequency(arrlist, str.charAt(i));
            hmap.put(str.charAt(i), freq);
        }

        for (Character c : hmap.keySet()) {
            System.out.print(c + "" + hmap.get(c));
        }
    }
}