java中的游程编码

java中的游程编码,java,run-length-encoding,Java,Run Length Encoding,如何以“nxw”形式打印特定数字的数字以及数字本身。n是数字的频率,w是数字本身 例如,如果用户的输入是1。输出为3x1 如果用户的输入在第一行为1,在第二行为7 1 0。输出为3x1.2x7.2x1.1x0。没有空间 注: 循环以一个点结束 数字不必按特定顺序排列 用户可以输入任意数量的数字 例如,输入可以是第一行的11,第二行的7,11,10。。。等等 这是到目前为止我的代码。但我知道这不是真的 import java.util.*; public class LaufLaeng

如何以“nxw”形式打印特定数字的数字以及数字本身。n是数字的频率,w是数字本身

例如,如果用户的输入是1。输出为3x1

如果用户的输入在第一行为1,在第二行为7 1 0。输出为3x1.2x7.2x1.1x0。没有空间

注:

  • 循环以一个点结束

  • 数字不必按特定顺序排列

  • 用户可以输入任意数量的数字

例如,输入可以是第一行的11,第二行的7,11,10。。。等等

这是到目前为止我的代码。但我知道这不是真的

import java.util.*;

public class LaufLaengenKodierung {

public static void main(String[] args) {
        
    Scanner sc = new Scanner(System.in);
        
    int freq = 0;
    int oldNum = 0;
    int num = 0;
    boolean first = true;
        
    while(sc.hasNextInt()) {
            
        int i = sc.nextInt();
            
        if(i == oldNum) {
                
            freq++;
            num = i;
                
        } else if(i != oldNum) {
                
            freq = 1;
            oldNum = i;
            num = i;
                
            if(first) {
                    
                first = false;
                num = i;
                freq = 1;
                    
            }
        }
    }
        
    System.out.print(freq + "x" + num + ".");
    sc.close();
}
        
}

您必须保存每个数字的计数。您可以通过为
0
9
的数字创建一个大小为10的
int
数组来实现这一点。然后是一个简单的循环,就像

while(sc.hasNextInt()) {
        
    int i = sc.nextInt();
    
    countArray[i]++;
}
然后检查数组中的每个元素,并在大于0时输出数字的计数。它可以是这样的:

for (int i=0; i<countArray.length; i++) {
    if (countArray[i] > 0) {
        System.out.printf("%dx%d.", countArray[i], i);
    }
}
for(int i=0;i 0){
System.out.printf(“%dx%d.”,countArray[i],i);
}
}

请记住,您必须检查用户输入的数字是否在0到9的范围内,否则会遇到
ArrayIndexOutOfBoundsException
s。现有代码需要稍微重构,以便在相同值的子序列结束后立即打印频率和整数值

static void printRLE(字符串输入){
扫描仪sc=新扫描仪(输入);
intfreq=0;
int-oldNum=0;
布尔值优先=真;
while(sc.hasnetint()){
int i=sc.nextInt();
如果(i!=oldNum | | first){
如果(第一)
第一个=假;
else//整数值已更改
System.out.printf(“%dx%d.”,freq,oldNum);
oldNum=i;
频率=1;
}否则{
freq++;
}
}
如果(!第一个)
System.out.printf(“%dx%d.%n”,频率,oldNum);
其他的
System.out.println(“未找到整数”);//如果正确,则打印0x0
sc.close();
}
测试:

String[]测试={
"",
“abc。”,
"11 11 11",
“11\n7 1 0”,
"0 0 0",
};    
用于(字符串测试:测试){
System.out.println(“test=[“+test+”]);
printRLE(测试);
系统输出打印项次(“----------”);
}
输出:

test=[]
No integer found
--------
test=[abc.]
No integer found
--------
test=[11 11 11]
3x11.
--------
test=[1 1 1
7 7 1 1 0]
3x1.2x7.2x1.1x0.
--------
test=[0 0 0]
3x0.
--------

更新 如果只需要对单独的数字进行计数(而不是整数),例如输入的
11
应转换为
6x1.
而不是如上所示的
3x11.
,则应重构该方法以处理数字中的数字:

静态无效数字(字符串输入){
扫描仪sc=新扫描仪(输入);
intfreq=0;
int-oldNum=0;
布尔值优先=真;
out:while(sc.hasNext()){
字符串s=sc.next();//获取用空格分隔的“number”
for(char c:s.toCharArray()){
如果(!Character.isDigit(c)){
爆发
}
int i=c-‘0’;
如果(i!=oldNum | | first){
如果(第一)
第一个=假;
else//数字已更改
System.out.printf(“%dx%d.”,freq,oldNum);
oldNum=i;
频率=1;
}否则{
freq++;
}
}
}
如果(!第一个)
System.out.printf(“%dx%d.%n”,频率,oldNum);
其他的
System.out.println(“未找到整数”);
sc.close();
}
测试输出:
“11 11”、“112 223”、“11 11\n7 1 0”、“0 0 0”


当前代码具体有什么问题?你能举一个失败的例子,包括输入、预期输出和实际输出吗?你如何知道用户何时完成输入整数?数字是按排序顺序输入的,还是按任意随机顺序输入的?@Brian McCutchon,如果输入为0。。输出为3x0。这是正确的。但是如果输入0 1。。输出为1x1。如果第一行的输入为0,第二行的输入为2,则输出为3x2。当它应该是0x3.3x2.@ @ Gilbert Le Blanc在用户进入“”时,或任何其他的整数时,代码都有bug。如果第一行的输入为1,第二行的输入为7 7 2 1,则输出为3x1.2x7.2x2。这是不正确的,因为它不包括最后一个数字,即1。那么,最后,应该是1x1。你准备好打赌了吗?在其他测试中,打印两种方法的
“1 1 \n7 2 2 1”的结果,如
测试=[1 1 1 7 2 1]数字:3x1.2x7.2x2.1x1。数字:3x1.2x7.2x2.1x1。
test=[11 11 11]
6x1.
--------
test=[112 223]
2x1.3x2.1x3.
--------
test=[1 1 1
7 7 1 1 0]
3x1.2x7.2x1.1x0.
--------
test=[0 0 0]
3x0.
--------