`
步青龙
  • 浏览: 297420 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
72ba33fb-eefe-3de1-bd65-82a6e579265d
Java面试
浏览量:0
社区版块
存档分类
最新评论

Excel 参照列并单元格算法

 
阅读更多

题目需要做的有2个功能

1 根据一个字符串数组 求出连续且相同的数组的起始和结束位置

2  b参考数组a,a数组中的相同且连续的字符串如"hi"的起始和结束位置分别为x,y那么就在数组b中求出x-y中的相同且连续的字符的起始和结束位置(数组a中相等且连续的字符可能很多,a中的一个x-y区间 对应在b中也可能有多个相同且连续的字符)。根据a相等且连续的区间求出b中相等且连续的字符的起始和结束位置。

 

 

这个基础的算法,奠定了java对excel合并单元格的思想。

	public static void main(String[] args) {
		int[] lon = new int[] {1,1,1,3,4,5,6,6,6,7,88,88,99};
		int b = 0;
		int start = 0;
		int end = 0;
		for (int i = 0; i < lon.length; i++) {
			if (b != lon[i] && b != 0) {
				if(start==(i-1)){
					System.out.println("数字   "+ b + "   起始位置和结束位置相同("+start+")");
				}else{
					System.out.println("数字   "+ b + "   起始位置为   " + start + "   结束位置为   "+ (i-1));
				}
			}
			end = i;
			if (b != lon[i]){
				b = lon[i];
				start = i;
			}
			if (end == lon.length - 1) {
				if(start==i){
					System.out.println("数字   "+ b + "   起始位置和结束位置相同("+start+")");
				}else{
					System.out.println("数字   "+b+ "   起始位置为   " + start + "   结束位置为   " + i);
				}
			}
		}
	}

修改完整:

 

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class MergeUtil {
	public Map getMixture(int referStart,int referEnd,int toStart,int toEnd){
		Map map = null;
		if(!(referEnd < toStart) && !(referStart > toEnd)){ // 判断是否有交集
			map = new HashMap();
			if(referStart>=toStart){// 如果有交集最小值取最大值
				map.put("min", referStart);
			}else{
				map.put("min", toStart);
			}
			if(referEnd>=toEnd){ //如果有交集最大值取最小值
				map.put("max", toEnd);
			}else{
				map.put("max", referEnd);
			}
		}
		return map;
	}
	/*
	 * 无参照
	 */
	public Map getColumn(String[] comlumnData,String startkey, String endkey) {
		Map map = new HashMap();
		String temp = "^&*";
		int start = 0;
		int end = 0;
		for (int i = 0; i < comlumnData.length; i++) {
			if (i>0){
				if (i < comlumnData.length - 1 && temp.equals(comlumnData[i - 1]) && !temp.equals(comlumnData[i])) {
					start = i;
				} else {
					if (!temp.equals(comlumnData[i])) { // 最后一个 
						start = i;
					}
				}
				end = i;
			}
			temp = comlumnData[i];
			map.put(startkey + comlumnData[i], new ExportBean(startkey + comlumnData[i], start, end));
		}
		return map;
	}
	/*
	 * 有参照列
	 */
	public Map  referenceToColumn(String[] reference,String[] to,String referenceStart,String referenceEnd,String toStart,String toEnd) {
		Map temp = new HashMap();
		Map referenceMap = getColumn(reference,referenceStart,referenceEnd);
		Map toMap = getColumn(to,toStart,toEnd );
		Iterator referenceIter = referenceMap.entrySet().iterator();
		Iterator toIter = toMap.entrySet().iterator();
		while (referenceIter.hasNext()) {
			Map.Entry referBeanEntry = (Map.Entry) referenceIter.next();
			ExportBean referBean = (ExportBean) referBeanEntry.getValue();
			while (toIter.hasNext()) {
				Map.Entry toBeanEntry = (Map.Entry) toIter.next();
				ExportBean toBean = (ExportBean) toBeanEntry.getValue();
				 Map mixture = getMixture(referBean.getStart(),referBean.getEnd(), toBean.getStart(), toBean.getEnd());
				 if(mixture!=null && mixture.get("min")!=mixture.get("max")){
					 toBean.setStart((Integer)mixture.get("min"));
					 toBean.setEnd((Integer)mixture.get("max"));
					 temp.put(toBean.getKeyname(), toBean);
					 System.out.println("有参照的列------" + toBean.getKeyname() + "--------"+ toBean.getStart() + "----------" + toBean.getEnd());
						
				 }
				/* if(toBean.getStart()>=referBean.getStart()&& toBean.getEnd()<=referBean.getEnd() && !(toBean.getStart()==toBean.getEnd())){
					System.out.println("有参照的列------" + toBean.getKeyname() + "--------"+ toBean.getStart() + "----------" + toBean.getEnd());
					 dosomething 
					temp.put(toBean.getKeyname(), toBean);
				 }*/
			}
			toIter = toMap.entrySet().iterator();
		}
		return temp;
	}
	public static void main(String[] args) {
	/*	String[] reference = new String[]{"1","1","1","1","1","1","1","1","1","2"};// 参考列
		String[] to =        new String[]{"1","1","1","2","2","5","9","9","a","a"};
		*/
		String[] reference = new String[]{"时间","时间","时间","时间","时间","时间","时间","时间2","时间2","时间2"};// 参考列
		String[] to =        new String[]{"时1","时1","时2","时3","时5","时5","时6","时6","时6","时6"};
		
		MergeUtil m = new MergeUtil();
		// 参照列测试
		Map  mmm = m.referenceToColumn(reference, to, "keyplaceIdStart", "keyplaceIdEnd", "projectStart","projectEnd");
		// 无参照咧测试
		Map  referenceMap = m.getColumn(reference, "cStart", "cEnd");
		Iterator referenceIter = referenceMap.entrySet().iterator();
		while (referenceIter.hasNext()) {
			Map.Entry referBeanEntry = (Map.Entry) referenceIter.next();
			ExportBean referBean = (ExportBean) referBeanEntry.getValue();
			System.out.println("无参照的列:  "+ referBean.getKeyname()+"   "+ referBean.getStart()+ "   "+ referBean.getEnd());
		}
	}
}
class ExportBean {
	private String keyname;
	private int start = 0;
	private int end = 0;
	public ExportBean(String keyname, int start, int end) {
		this.keyname = keyname;
		this.start = start;
		this.end = end;
	}
	public String getKeyname() {
		return keyname;
	}
	public void setKeyname(String keyname) {
		this.keyname = keyname;
	}
	public int getStart() {
		return start;
	}
	public void setStart(int start) {
		this.start = start;
	}
	public int getEnd() {
		return end;
	}
	public void setEnd(int end) {
		this.end = end;
	}
}
 

下面再次修改如下,现在看着清爽很多而且还去掉了一些bug。

 

public class MergeUtils {
	int start = 0;
	public List getColumn(List list,String[] comlumnData) {
		for (int i = 0; i < comlumnData.length; i++) {
			if (i>0 && !comlumnData[i-1].equals(comlumnData[i])) // 当前值与上一个值不同
				start = i;
			if(start!=i && !(i<(comlumnData.length-1) && comlumnData[i].equals(comlumnData[i+1])))
					list.add(new Export(start,i));
		}
		return list;
	}

	/*
	 * 有参照列
	 */
	public List referenceToColumn(String[] reference, String[] to) {
		String[] comlumnData = new String[to.length];
		for(int i=0;i<comlumnData.length;i++) 
		 comlumnData[i] = reference[i]+to[i];
		return getColumn(new ArrayList(),comlumnData);
	}

	public static void main(String[] args) {
		String[] reference = new String[] { "时间", "时间", "时间","时间","时间","时间", "时间", "时间2","时间2","时间"  };// 参考列
		String[] to = new String[] { "时1", "时1", "时2", "时3", "时5", "时5", "时6","时6", "时6", "时7" };
		MergeUtils m = new MergeUtils();
		List mmm = m.referenceToColumn(reference, to);
		Iterator ite = mmm.iterator();
		while(ite.hasNext()){
			Export ex = (Export)ite.next();
			System.out.println("开始:" + ex.getStart() + " 结束:" + ex.getEnd());
		}
	}
}

class Export {
	private int start = 0;
	private int end = 0;
	public Export(int start, int end) {
		this.start = start;
		this.end = end;
	}
	public int getStart() {
		return start;
	}
	public void setStart(int start) {
		this.start = start;
	}
	public int getEnd() {
		return end;
	}
	public void setEnd(int end) {
		this.end = end;
	}
}
 

 

分享到:
评论

相关推荐

    Excel百宝箱8.0

    【生成系统图标】【获取内置命令】【修复Excel】【破解VBA密码】【删除空单元格】【转置选区】【按列倒置】【按列倒置】【字母大小写转换】【小写金额转大写】【大写金额转小写】【区域数据加密】【多区域复制】【按...

    批量excel文件内容查找

    然后,输入要查找的关键字或文本串,软件会自动开始扫描并显示所有包含该文本的文件及其所在的单元格位置。这样,用户可以快速定位到含有特定信息的Excel文件和具体行数,极大地提高了工作效率。 “批量excel文件...

    EXCEL百宝箱8.0终极版

    【取消合并还原合并数据】:对一列中合并后的单元格取消合并,且恢复合并前所有数据 【合并数据并复制】:可以将一个区域的数据直接复制到一个单元格中 【合并区域自动换行】:可以让具有合并单元格的区域在自动换行...

    excel中汉字转拼音技巧

    在Excel中创建汉字转拼音的VBA函数,我们可以参照提供的部分代码。这段代码定义了一个名为`PinYin`的自定义函数,它接收一个含有汉字的字符串`Hz`作为参数。函数的主要工作原理是通过一个巨大的字符串`PinMa`来存储...

    2021-2022计算机二级等级考试试题及答案No.4249.docx

    - 合并单元格并居中:可以使用Excel的“合并和居中”功能,将表名放置在工作表顶部。 - 序号列填充:在序号列中手动输入1到15,然后设置数据格式为数值,无小数位,居中对齐。 - 会计专用格式设置:选择基础工资...

    totest_exel_FlightControl_python_

    这些脚本可能包含用于读取飞行控制输入数据、处理数据并写入Excel的函数。 2. mytry.xlsx 和 original.xlsx:这些可能是转换结果的Excel文件,"mytry" 可能是作者尝试后的输出,而 "original" 可能是参照的原始数据...

    基于LabView的电源组件数据处理系统设计.pdf

    在此处的上下文中,它可能被用于执行Excel VBA脚本,实现诸如打开Excel文件、选择工作表、读写单元格等任务。 8. “AddMoveDeleteCopy”和“ReadCells WriteCells”等操作表明系统设计需要支持对Excel文件的常规...

    2021-2022计算机二级等级考试试题及答案No.5085.docx

    17. Excel绝对单元格地址:$D$4表示绝对引用,无论单元格如何移动,始终指向D列第4行。 18. C语言表达式:程序中的(n=6*4,n+6),n*2;是一个逗号表达式,最后的值是n*2的结果,所以输出为C.60。 19. VB工程文件:...

    2021-2022计算机二级等级考试试题及答案No.5108.docx

    9. 活动单元格:在电子表格软件如 Excel 中,活动单元格是指当前正在接收输入的单元格。 10. 外键:外键是参照完整性的一种机制,用于关联两个表,但外键并不一定是唯一标识元组的属性。 11. C++ 输出:在 C++ 中...

    2021-2022计算机二级等级考试试题及答案No.15356.docx

    - 合并单元格并居中标题,调整字体和字号。 - 输入序号并设置为数值格式,无小数,居中对齐。 - 设置基础工资后的列格式为会计专用,保留两位小数,无货币符号。 - 调整列宽和对齐方式以优化显示效果。 - 设置...

    27产品抽检记录表.zip

    Excel提供了丰富的功能,如单元格计算、数据分析、图表制作等,特别适合整理和分析抽检数据。 27产品抽检记录表.xlsx的内容可能包括以下部分: 1. 产品编号:每种产品的唯一标识符,便于追踪和管理。 2. 产品名称:...

    2021-2022计算机二级等级考试试题及答案No.16822.docx

    12. **Excel地址** - Excel工作表中,每个单元格的唯一编号是地址,通常用列标加行号表示(正确答案:A)。 13. **算术运算** - 对于语句 `a+=a-=a*a`,如果`a`初值为4,执行后`a`的值将变为-24(正确答案:A)。 ...

    2021-2022计算机二级等级考试试题及答案No.3697.docx

    11. **Excel单元格地址**:Excel中单元格的地址使用列标和行号组合表示,如A1,因此正确答案是B。 12. **VBA程序控制流**:VBA中的程序流程控制包括顺序控制、分支控制和循环控制,所以正确答案是D。 13. **硬盘...

    2021-2022计算机二级等级考试试题及答案No.5263.docx

    4. **Excel2003单元格对齐** - 在Excel中,数字默认是右对齐。 5. **IP地址与域名** - Internet上的地址有两种表示形式,即IP地址和域名地址,两者可以相互转换。 6. **HTTP请求方法** - 若想将表单数据以字符串的...

    2021-2022计算机二级等级考试试题及答案No.11998.docx

    3. **PowerPoint撤销操作**:在PowerPoint中,创建表格时如果插入操作错误,可以使用撤销按钮来恢复,但撤销按钮并不能撤销表格的插入,只能撤销最近的操作,如单元格的添加或格式修改等。 4. **访问修饰符**:在...

    2021-2022计算机二级等级考试试题及答案No.10912.docx

    4. Excel中显示####表示单元格宽度不足以显示其中的数据,需要调整单元格宽度或更改数据格式。 5. 排序算法中,冒泡排序在最坏情况下的比较次数为n(n-1)/2,快速排序在最坏情况下也是这个数量级。 6. 使用SQL添加...

    2021-2022计算机二级等级考试试题及答案No.12249.docx

    例如,绝对引用D列第4行交叉位置处的单元格应使用`$D$4`。 - **应用场景**:绝对引用常用于公式中,确保在复制公式时引用的单元格保持不变。 ### 12. SQL语言概述 - **知识点**:SQL(Structured Query Language)...

    南开20春学期《大学计算机基础》在线作业解答全貌.docx

    3. **Excel功能**:“∑”按钮表示自动求和(A),是Excel中最常见的函数之一,用于快速计算单元格区域的总和。 4. **八进制到二进制转换**:八进制数304.23转换为二进制是11000100.010011(C),这是数值转换的...

    水工艺程序设计课程考试题目2013.doc

    2. 在Excel中,计算y=x²sin(x),应在B1单元格输入公式=B1^2*sin(B1),所以选B。 3. 解非线性方程适用于已知流量、流速、设计管径和要求的充满度情况,选项C。 4. `scanf`函数中`%d`用于读取十进制整型,所以变量a的...

Global site tag (gtag.js) - Google Analytics