Java案例:合并编辑找出的问题句子

【题目描述】

       为了提高文章质量,每一篇文章(假设全都是英文)都会有m名编辑进行审核,每个编辑独立工作,会把有问题的句子通过下标记录下来,比如[1,10],1表示病句的第一个字符,10表示病句的最后一个字符。也就是从1到10这10个字符组成的句子,是有问题的。

       现在需要把多名编辑有问题的句子合并起来,送给总编辑进行审核,比如编辑A指出的病句是[1,10],[32,45];编辑B指出的病句是[5,16],[78,94],那么[1,10]和[5,16]是有交叉的,可以合并成[1,16],[32,45],[78,94]。最后得到的结果要按升序进行排列。

 

【代码】

package com.xzw.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 输入:编辑数量m,之后每行是每个编辑的标记的下标集合,
 *     第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔。
 * 输出:合并后的下标集合,第一个和最后一个下标用英文逗号分隔,每组
 *     下标之间用分号分隔。返回结果是从小到大的递增排序。
 * 示例:
 * 输入:3
 *     1,10;32,45
 *     78,94;5,16
 *     80,100;200,220;16,32
 * 输出:1,45;78,100;200,220     
 * @author xzw
 *
 */
public class Editor {
	
	/**
	 * 主函数
	 * @param args
	 */
	public static void main(String[] args) {
		new Editor().input(3, new String[]{"1,10;32,45","78,94;5,16","80,100;200,220;16,32"});
	}
	
	/**
	 * 输入方法
	 * @param editorsCount 编辑的数量
	 * @param questionSentence 每个编辑标记的下标集合
	 */
	public void input(int editorsCount, String... questionSentence){
		//定义一个列表,用于存放分割后的编辑找出的问题下标
		List<String> list = new ArrayList<String>();

		//分隔每个编辑找出的问题下标并存到列表中
		for (int i = 0; i < questionSentence.length; i++) {
			for (int j = 0; j < questionSentence[i].split(";").length; j++) {
				list.add(questionSentence[i].split(";")[j]);
			}
		}

		//将编辑找出的有包含或者重叠的部分进行整合操作
		index: for (int i = 0; i < list.size(); i++) {
			for (int j = i + 1; j < list.size(); j++) {
				if (Integer.parseInt(list.get(j).split(",")[0]) <= Integer.parseInt(list.get(i).split(",")[1]) && Integer.parseInt(list.get(i).split(",")[1]) <= Integer.parseInt(list.get(j).split(",")[1])) {
					if (Integer.parseInt(list.get(i).split(",")[0]) <= Integer.parseInt(list.get(j).split(",")[0])) {
						Collections.replaceAll(list, list.get(i), list.get(i).split(",")[0] + "," + list.get(j).split(",")[1]);
						removeElement(list, list.get(j));
						i--;
						continue index;
					} else {
						Collections.replaceAll(list, list.get(i), list.get(j).split(",")[0] + "," + list.get(j).split(",")[1]);
						removeElement(list, list.get(j));
						i--;
						continue index;
					}
				}
			}
		}
		
		//将结果从小到大排序
		for (int i = 0; i < list.size() - 1; i++) {
			for (int j = 0; j < list.size() - (i + 1); j++) {
				if (Integer.parseInt(list.get(j).split(",")[0]) > Integer.parseInt(list.get(j + 1).split(",")[0])) {
					String value = list.get(j);
					Collections.replaceAll(list, list.get(j), list.get(j + 1));
					Collections.replaceAll(list, list.get(j + 1), value);
				}
			}
		}
		
		//遍历输出结果
		for (int i = 0; i < list.size(); i++) {
			if (i == list.size() - 1) {
				System.out.println(list.get(i));
			} else {
				System.out.print(list.get(i) + ";");
			}
		}
	}

	/**
	 * 删除列表中指定的元素
	 * @param list 删除的列表
	 * @param target 被删除的值
	 */
	public void removeElement(List<String> list, String target){
		for(int i = list.size() - 1; i >= 0; i--){
			String item = list.get(i);
			if(target.equals(item)){
                list.remove(item);
            }
		}
	}

}

 

【输出结果】

1,45;78,100;200,220

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

象在舞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值