用数据结构(Java版)字符串和多维数组的应用编写可实现完整代码:变量字符串类MyStringBuffer声明成员方法 public MyStringBuffer deleteCharAt(int i)//删除this串的第i个字符
时间: 2024-11-20 08:42:21 浏览: 9
在Java中,我们可以创建一个名为`MyStringBuffer`的类,它是一个自定义的线程安全版本的字符串缓冲区,实现了类似`java.lang.StringBuffer`的功能,并包括一个`deleteCharAt`方法用于删除指定索引处的字符。以下是一个简单的实现:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyStringBuffer {
private final char[] buffer;
private int size = 0;
private final Lock lock = new ReentrantLock();
// 构造函数,初始化一个空的缓冲区
public MyStringBuffer() {
buffer = new char[16];
}
// 删除指定索引处的字符
public void deleteCharAt(int i) {
if (i < 0 || i >= size) {
throw new IndexOutOfBoundsException("Index out of bounds");
}
lock.lock();
try {
// 移动后续字符到删除位置
for (int j = i; j < size - 1; j++) {
buffer[j] = buffer[j + 1];
}
// 减小size并更新最后一个字符
size--;
if (size == 0) {
buffer[size] = '\0'; // 如果所有字符都被删除,设置结束标志
}
} finally {
lock.unlock();
}
}
// 添加字符到尾部
public synchronized void append(char c) {
ensureCapacity(size + 1);
buffer[size++] = c;
}
// 确保有足够的空间添加字符
private synchronized void ensureCapacity(int minCapacity) {
if (minCapacity > buffer.length) {
char[] temp = new char[Math.max(minCapacity, buffer.length * 2)];
System.arraycopy(buffer, 0, temp, 0, size);
buffer = temp;
}
}
@Override
public String toString() {
return new String(buffer, 0, size); // 转换为字符串以便查看
}
// 可供测试使用的main方法
public static void main(String[] args) {
MyStringBuffer sb = new MyStringBuffer();
sb.append("Hello, World!");
sb.deleteCharAt(7); // 删除逗号
System.out.println(sb); // 输出 "Hello, World!"
}
}
```
这个`MyStringBuffer`类包含了线程锁来保证多线程环境下的操作安全。在`deleteCharAt`方法中,我们先检查索引是否越界,然后使用同步块锁定缓冲区,避免并发修改。当需要删除字符时,将后面的字符依次向前移动一位,并相应地减少`size`。
阅读全文