在Java编程中,有时我们需要处理字符串并进行特定操作,如统计字符个数或反序非相同字符。本文将详细介绍这两种方法,并提供示例代码。
让我们关注如何统计字符串中的字符个数。在给定的代码片段中,我们看到一个名为`Test2`的类,其中包含一个`main`方法。这个方法首先定义了一个字符串`src`,然后通过`replaceAll`方法移除所有空格。接下来,它创建了一个`ArrayList<Character>`和一个大小为256的整型数组`bb`,用于存储每个字符的出现次数。字符数组`cs`由`src`转换而来,然后通过双指针法实现字符串的反转。在反转过程中,两个指针分别从头和尾向中间移动,交换对应的字符。反转完成后,遍历字符数组,如果字符在`bb`数组中的计数小于1,说明该字符在原字符串中只出现了一次,将其添加到列表`list`中。打印出这些非重复字符及其出现次数。
```java
public class Test2 {
public static void main(String[] args) {
String src = "A B C D E B C";
src = src.replaceAll(" ", ""); // 去除空格
System.out.println("去除空格后字符串:" + src);
List<Character> list = new ArrayList<>();
int[] bb = new int[256];
char[] cs = src.toCharArray();
// 字符串反转
int mid = cs.length / 2;
int idx = cs.length - 1;
for (int i = 0; i < mid; i++) {
char tmp = cs[i];
cs[i] = cs[idx];
cs[idx] = tmp;
idx--;
}
// 统计非重复字符
for (char c : cs) {
if (bb[c] < 1) {
list.add(c);
}
bb[c]++;
}
// 打印非重复字符
for (char c : list) {
System.out.print(c);
}
System.out.println();
// 打印非重复字符及其出现次数
for (int i = 0; i < list.size(); i++) {
char c = list.get(i);
System.out.println(c + " " + bb[c] + "次");
}
}
}
```
接着,我们看如何查找一个字符串(`a`)中是否存在另一个字符串(`b`)中的字符。这里有一个名为`Test`的类,同样包含一个`main`方法。这个方法首先创建了两个字符串`a`和`b`,然后为`b`中的每个字符创建一个大小为256的字节数组`bb`,并初始化每个元素为0。接着,遍历`b`的字符,将对应位置的字节设为1。然后,遍历`a`的字符,检查其在`bb`数组中的值是否为1,如果是,则表示该字符在`b`中出现过,打印出来。
```java
public class Test {
public static void main(String[] args) {
String a = "abcd,efg";
String b = ")(*&^%$#@![]{},.//;:'? <>";
byte[] bb = new byte[256];
char[] cs = b.toCharArray();
for (char c : cs) {
bb[c] = 1;
}
cs = a.toCharArray();
for (char c : cs) {
if (bb[c] == 1) {
System.out.println(c);
}
}
}
}
```
这两个方法在处理字符串时都具有较高的效率,尤其是对于小规模字符串。在统计字符个数时,使用数组可以快速访问和更新计数值;在查找字符是否出现时,利用预处理的字节数组可以高效地进行查找。然而,如果字符串非常大,这种方法可能会受到内存限制的影响。在这种情况下,可以考虑使用更高级的数据结构,如哈希表,以降低空间复杂度并保持较高的时间效率。