import java.util.Arrays;
import java.util.Scanner;
/**
* 往代表号码段的字符串里添加新号码段,求结果串。
* codes: 代表号码段的字符串,格式如:5-20,30-50,78-90
* code: 新号码段,格式如:22-29
* return: 结果串,要注意号码段合并处理,如以上结果应该为: 5-20,22-50,78-90
* 而不是:5-20,22-29,30-50,78-90 不用考虑号码重复问题,即以上串不会添加10-40
*/
public class Numberinsert {
// 系统入口的方法
public static void main(String[] args) {
// 实例化类获取一个实例(可以把下面的方法改为static,就可以直接使用类名调用)
Numberinsert numberinsert = new Numberinsert();
// 获取控制台要测试的情况
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("********请输入数字1或2或3进行测试(输入4退出系统)********");
int index = scanner.nextInt();
switch (index) {
case 1:
// 传入测试的号码字符串
System.out.println(numberinsert.getString("5-20,30-50,78-90",
"22-29"));// 情况一
break;
case 2:
System.out.println(numberinsert.getString("5-20,30-50,78-90",
"21-29"));// 情况二
break;
case 3:
System.out.println(numberinsert.getString("5-20,30-50,78-90",
"60-70"));// 情况三
break;
case 4:
System.out.println("欢迎再次测试本系统...再见");
System.exit(0);
default:
break;
}
}
}
// 返回新的号码段
public String getString(String codes, String code) {
// 拆分原号码段("5-20,30-50,78-90"转变成["5-20","30-50","78-90"])
String[] numbers = this.getNumbers(codes);
// 用于获取号码段两头的数值
int[] number = null;
// 这个数值数组用于原号码段数字与新插入号码段数字存储/对比之用
int[] num = new int[numbers.length * 2 + 2];
// 用于标识数组下标
int n = 0;
for (String str : numbers) {
// 取出原号码段中的数字放入int型数组中
number = this.getNumber(str);
num[n] = number[0];
n++;
num[n] = number[1];
n++;
}
// 获取插入号码段的数值
number = this.getNumber(code);
int insert1 = number[0];
int insert2 = number[1];
// 用于标识是否有必要把新号码段的数值存入上面的int型数组
boolean insert1b = false;
boolean insert2b = false;
for (int i = 0; i < num.length; i++) {
// 原号码段数值中是否存在于新号码段相邻的数值
int increase = num[i] + 1;
int decrease = num[i] - 1;
if (increase == insert1) {
// 这里使用数组中0为无效的数值
num[i] = 0;
insert1b = true;
}
if (decrease == insert2) {
num[i] = 0;
insert2b = true;
}
}
if (!insert1b) {
num[num.length - 2] = insert1;
}
if (!insert2b) {
num[num.length - 1] = insert2;
}
// 把新数组排序
Arrays.sort(num);
// 用于构造新的号码段
StringBuilder result = new StringBuilder();
for (int j = 0; j < num.length; j++) {
if (num[j] != 0) {
result.append(num[j] + "-" + num[++j] + ",");
}
}
// System.out.println(result.toString().substring(0, result.length() - 1));
return result.toString().substring(0, result.length() - 1);
}
// 拆分原号码段的方法
public String[] getNumbers(String codes) {
return codes.split(",");
}
// 拆分号码段的数字(如:22-29,拆分为22,29两个数值)
public int[] getNumber(String code) {
String[] number = code.split("-");
int[] num = { Integer.valueOf(number[0]), Integer.valueOf(number[1]) };
return num;
}
}
往代表号码段的字符串里添加新号码段,求结果串。
最新推荐文章于 2024-09-25 11:06:23 发布