拆分此字符串以获得相应字符的最大计数
Splitting this string to get the max count to a corresponding character
我目前正在为文本压缩实施 运行 长度编码,我的算法执行 return 以下形式的字符串:
假设我们有一个字符串作为输入
"AAAAABBBBCCCCCCCC"
然后我的算法returns
"1A2A3A4A5A1B2B3B4B1C2C3C4C5C6C7C8C"
现在我想应用Java String split来解决这个问题,因为我想得到字符对应的最大数字。对于我们的示例,它将是
"5A4B8C"
我的功能可以看下面
public String getStrfinal(){
String result = "";
int counter = 1;
StringBuilder sb = new StringBuilder();
sb.append("");
for (int i=0;i<str.length()-1;i++) {
char c = str.charAt(i);
if (str.charAt(i)==str.charAt(i+1)) {
counter++;
sb.append(counter);
sb.append(c);
}
else {
counter = 1;
continue;
}
}
result = sb.toString();
return result;
}
您可以使用地图代替字符串缓冲区,这样做会更容易、更干净。
public static void main(String[] args) {
String input = "AAAAABBBBCCCCCCCCAAABBBDDCCCC";
int counter=1;
for(int i=1; i<input.length(); i++) {
if(input.charAt(i-1)==input.charAt(i)) {
counter=counter+1;
}else if(input.charAt(i-1)!=input.charAt(i)){
System.out.print(counter+Character.toString(input.charAt(i-1)));
counter=1;
}if(i==input.length()-1){
System.out.print(counter+Character.toString(input.charAt(i)));
}
}
}
这将给出
5A4B8C3A3B2D4C
更新
如果字符串包含数字,我同意@WJS 输出变得混乱
因此,如果上面代码中的 System.out 将与下面的代码交换,即
System.out.print(Character.toString(input.charAt(i-1))+"="+counter+" ");
然后输入像
AAAAABBBBCCCCCCCCAAABBBDD556677CCCCz
我们出门如下
A=5 B=4 C=8 A=3 B=3 D=2 5=2 6=2 7=2 C=4 z=1
public static String getStrfinal(){
StringBuilder sb = new StringBuilder();
char last = 0;
int count = 0;
for(int i = 0; i < str.length(); i++) {
if(i > 0 && last != str.charAt(i)) {
sb.append(count + "" + last);
last = 0;
count = 1;
}
else {
count++;
}
last = str.charAt(i);
}
sb.append(count + "" + last);
return sb.toString();
}
这是一种可能的解决方案。它从原始字符串开始,然后简单地遍历整个字符串。
public static void main(String[] args) {
String input = "AAAABBBCCCCCCCDDDEAAFBBCD";
int index = 0;
StringBuilder sb = new StringBuilder();
while (index < input.length()) {
int count = 0;
char c = input.charAt(index);
for (; index < input.length(); index++) {
if (c != input.charAt(index)) {
count++;
}
else {
break;
}
}
sb.append(Integer.toString(count));
sb.append(c);
count = 0;
}
System.out.println(sb.toString());
}
但是这种方法和其他方法的一个问题是如果文本中有数字会怎样?例如。如果字符串是 AAABB999222AAA
将压缩为 3A2B39323A
怎么办?这也可能意味着 AAABB
后跟 39 3's
和 23 A's
这是您问题的可能解决方案之一。我们可以使用类似于 HashMap 的 LinkedHashMap 数据结构,但它也保持顺序。因此,我们可以遍历字符串并将每个字符的出现作为 Key-value 对存储到映射中,并轻松检索其最大出现。
public String getStrFinal(String str){
if(str==null || str.length()==0) return str;
LinkedHashMap<Character,Integer> map = new LinkedHashMap<>();
StringBuilder sb=new StringBuilder(); // to store the final string
for(char ch:str.toCharArray()){
map.put(ch,map.getOrDefault(ch,0)+1); // put the count for each character
}
for(Map.Entry<Character,Integer> entry:map.entrySet()){ // iterate the map again and append each character's occurence into stringbuilder
sb.append(entry.getValue());
sb.append(entry.getKey());
}
System.out.println("String = " + sb.toString()); // here you go, we got the final string
return sb.toString();
}
我目前正在为文本压缩实施 运行 长度编码,我的算法执行 return 以下形式的字符串:
假设我们有一个字符串作为输入
"AAAAABBBBCCCCCCCC"
然后我的算法returns
"1A2A3A4A5A1B2B3B4B1C2C3C4C5C6C7C8C"
现在我想应用Java String split来解决这个问题,因为我想得到字符对应的最大数字。对于我们的示例,它将是
"5A4B8C"
我的功能可以看下面
public String getStrfinal(){
String result = "";
int counter = 1;
StringBuilder sb = new StringBuilder();
sb.append("");
for (int i=0;i<str.length()-1;i++) {
char c = str.charAt(i);
if (str.charAt(i)==str.charAt(i+1)) {
counter++;
sb.append(counter);
sb.append(c);
}
else {
counter = 1;
continue;
}
}
result = sb.toString();
return result;
}
您可以使用地图代替字符串缓冲区,这样做会更容易、更干净。
public static void main(String[] args) {
String input = "AAAAABBBBCCCCCCCCAAABBBDDCCCC";
int counter=1;
for(int i=1; i<input.length(); i++) {
if(input.charAt(i-1)==input.charAt(i)) {
counter=counter+1;
}else if(input.charAt(i-1)!=input.charAt(i)){
System.out.print(counter+Character.toString(input.charAt(i-1)));
counter=1;
}if(i==input.length()-1){
System.out.print(counter+Character.toString(input.charAt(i)));
}
}
}
这将给出
5A4B8C3A3B2D4C
更新
如果字符串包含数字,我同意@WJS 输出变得混乱
因此,如果上面代码中的 System.out 将与下面的代码交换,即
System.out.print(Character.toString(input.charAt(i-1))+"="+counter+" ");
然后输入像
AAAAABBBBCCCCCCCCAAABBBDD556677CCCCz
我们出门如下
A=5 B=4 C=8 A=3 B=3 D=2 5=2 6=2 7=2 C=4 z=1
public static String getStrfinal(){
StringBuilder sb = new StringBuilder();
char last = 0;
int count = 0;
for(int i = 0; i < str.length(); i++) {
if(i > 0 && last != str.charAt(i)) {
sb.append(count + "" + last);
last = 0;
count = 1;
}
else {
count++;
}
last = str.charAt(i);
}
sb.append(count + "" + last);
return sb.toString();
}
这是一种可能的解决方案。它从原始字符串开始,然后简单地遍历整个字符串。
public static void main(String[] args) {
String input = "AAAABBBCCCCCCCDDDEAAFBBCD";
int index = 0;
StringBuilder sb = new StringBuilder();
while (index < input.length()) {
int count = 0;
char c = input.charAt(index);
for (; index < input.length(); index++) {
if (c != input.charAt(index)) {
count++;
}
else {
break;
}
}
sb.append(Integer.toString(count));
sb.append(c);
count = 0;
}
System.out.println(sb.toString());
}
但是这种方法和其他方法的一个问题是如果文本中有数字会怎样?例如。如果字符串是 AAABB999222AAA
将压缩为 3A2B39323A
怎么办?这也可能意味着 AAABB
后跟 39 3's
和 23 A's
这是您问题的可能解决方案之一。我们可以使用类似于 HashMap 的 LinkedHashMap 数据结构,但它也保持顺序。因此,我们可以遍历字符串并将每个字符的出现作为 Key-value 对存储到映射中,并轻松检索其最大出现。
public String getStrFinal(String str){
if(str==null || str.length()==0) return str;
LinkedHashMap<Character,Integer> map = new LinkedHashMap<>();
StringBuilder sb=new StringBuilder(); // to store the final string
for(char ch:str.toCharArray()){
map.put(ch,map.getOrDefault(ch,0)+1); // put the count for each character
}
for(Map.Entry<Character,Integer> entry:map.entrySet()){ // iterate the map again and append each character's occurence into stringbuilder
sb.append(entry.getValue());
sb.append(entry.getKey());
}
System.out.println("String = " + sb.toString()); // here you go, we got the final string
return sb.toString();
}