往代表号码段的字符串里添加新号码段,求结果串。

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;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值