import java.util.ArrayList;import java.util.List;/** *//** * 单元矩阵 * * @author zfzheng * @version 2004-11-15 */public class CellMatrix ...{ private CellMatrix() ...{ } public static void dumpMatrix(Object[][] dd) ...{ for (int i = 0; i < dd.length; i++) ...{ for (int j = 0; j < dd[i].length; j++) ...{ System.out.print(" " + dd[i][j]); } System.out.println(); } } public static String getDumpMatrixString(Object[][] dd) ...{ StringBuffer sb = new StringBuffer(); for (int i = 0; i < dd.length; i++) ...{ for (int j = 0; j < dd[i].length; j++) ...{ sb.append(dd[i][j]).append(" "); } sb.append(" "); } return sb.toString(); } /** *//** * 列表转换为列矩阵 */ public static Object[][] listToMatrix(List list) ...{ Object[][] objs = new Object[list.size()][1]; for (int i = 0; i < objs.length; i++) ...{ objs[i] = new Object[1]; objs[i][0] = list.get(i); } return objs; } /** *//** * 对角线翻转 */ public static Object[][] turnCatercorner(Object[][] dd) ...{ if (dd == null || dd.length == 0) ...{ return dd; } int rows = dd.length; int cols = dd[0].length; Object[][] dd2 = new Object[cols][rows]; for (int i = 0; i < rows; i++) ...{ for (int j = 0; j < cols; j++) ...{ dd2[j][i] = dd[i][j]; } } return dd2; } /** *//** * 顺时针翻转90度 */ public static Object[][] turnClockwise(Object[][] dd) ...{ if (dd == null || dd.length == 0) ...{ return dd; } int rows = dd.length; int cols = dd[0].length; Object[][] dd2 = new Object[cols][rows]; for (int i = 0; i < rows; i++) ...{ for (int j = 0; j < cols; j++) ...{ dd2[j][rows - i - 1] = dd[i][j]; } } return dd2; } /** *//** * 逆时针翻转90度 */ public static Object[][] turnAntiClockwise(Object[][] dd) ...{ if (dd == null || dd.length == 0) ...{ return dd; } int rows = dd.length; int cols = dd[0].length; Object[][] dd2 = new Object[cols][rows]; for (int i = 0; i < rows; i++) ...{ for (int j = 0; j < cols; j++) ...{ dd2[cols - j - 1][i] = dd[i][j]; } } return dd2; } /** *//** * 表笛卡儿乘积(与sql select两表同) */ public static Object[][] descartesProduct(Object[][] dd1, Object[][] dd2) ...{ if (dd1 == null || dd1.length == 0) ...{ return dd2; } if (dd2 == null || dd2.length == 0) ...{ return dd1; } int row1 = dd1.length; int col1 = dd1[0].length; int row2 = dd2.length; int col2 = dd2[0].length; Object[][] objs = new Object[row1 * row2][col1 + col2]; for (int i = 0; i < objs.length; i++) ...{ //行 objs[i] = new Object[col1 + col2]; for (int j = 0; j < col1 + col2; j++) ...{ //列 if (j < col1) ...{ objs[i][j] = dd1[i / row2][j]; } else ...{ objs[i][j] = dd2[i % row2][j - col1]; } } } return objs; } /** *//** * 水平级乘积 */ public static Object[][] horizontalLevelProduct(Object[][] dd1, Object[][] dd2) ...{ return turnClockwise(descartesProduct(dd1, turnAntiClockwise(dd2))); } /** *//** * 连接矩阵,数据为向下水平对齐,其余填充null */ public static Object[][] join(Object[][] dd1, Object[][] dd2) ...{ if (dd1 == null || dd1.length == 0) ...{ return dd2; } if (dd2 == null || dd2.length == 0) ...{ return dd1; } int row1 = dd1.length; int row2 = dd2.length; int row = Math.max(row1, row2); int col1 = dd1[0].length; int col2 = dd2[0].length; int col = col1 + col2; Object[][] re = new String[row][col]; if (row1 > row2) ...{ for (int i = 0; i < row1; i++) ...{ for (int j = 0; j < col1; j++) ...{ re[i][j] = dd1[i][j]; } } int n = row1 - row2; for (int i = 0; i < row2; i++) ...{ for (int j = 0; j < col2; j++) ...{ re[i + n][j + col1] = dd2[i][j]; } } } else ...{ int n = row2 - row1; for (int i = 0; i < row1; i++) ...{ for (int j = 0; j < col1; j++) ...{ re[i + n][j] = dd1[i][j]; } } for (int i = 0; i < row; i++) ...{ for (int j = 0; j < col2; j++) ...{ re[i][j + col1] = dd2[i][j]; } } } return re; } public static List parseAutoMatchMergeRegion(Object[][] dd) ...{ return parseAutoMatchMergeRegion(dd,true,true,true); } /** *//** * 自动匹配融合区,返回融合区域列表 * @param rowDir 横向融合 * @param colDir 纵向融合 * @return list#{x1,y1,x2,y2} */ public static List parseAutoMatchMergeRegion(Object[][] dd,boolean rowDir, boolean colDir,boolean withNullEq) ...{ List list = new ArrayList(); if (dd == null || dd.length == 0 || (!rowDir&&!colDir)) ...{ return list; } List keyList = new ArrayList(); int rows = dd.length; int cols = dd[0].length; Object lastKey = null; Object curKey = null; int len = 0; if(rowDir)...{ //横向 for (int i = 0; i < rows; i++) ...{ for (int j = 0; j < cols; j++) ...{ curKey = dd[i][j]; if (j == 0) ...{ lastKey = curKey; len = 0; continue; } if ((j != cols - 1) && equalsTo(curKey, lastKey ,withNullEq)) ...{ len++; continue; } else ...{ if (j == cols - 1 && equalsTo(curKey, lastKey ,withNullEq)) ...{ list.add(new int[] ...{ j - len - 1, i, j, i }); keyList.add(lastKey); } else if (len > 0) ...{ list.add(new int[] ...{ j - len - 1, i, j - 1, i }); keyList.add(lastKey); } lastKey = curKey; len = 0; } } } } if(colDir)...{ //纵向 for (int i = 0; i < cols; i++) ...{ for (int j = 0; j < rows; j++) ...{ curKey = dd[j][i]; if (j == 0) ...{ lastKey = curKey; len = 0; continue; } if ((j != rows - 1) && equalsTo(curKey, lastKey ,withNullEq)) ...{ len++; continue; } else ...{ if (j == rows - 1 && equalsTo(curKey, lastKey ,withNullEq)) ...{ list.add(new int[] ...{ i, j - len - 1, i, j }); keyList.add(lastKey); } else if (len > 0) ...{ list.add(new int[] ...{ i, j - len - 1, i, j - 1 }); keyList.add(lastKey); } lastKey = curKey; len = 0; } } } } if(rowDir&&colDir)...{ //合并“融合区” int[] last = null; int[] cur = null; for (int i = 0; i < list.size() - 1; i++) ...{ last = (int[]) list.get(i); lastKey = keyList.get(i); for (int j = i + 1; j < list.size(); j++) ...{ cur = (int[]) list.get(j); curKey = keyList.get(j); if (equalsTo(curKey, lastKey ,withNullEq)) ...{ boolean canBeMerge=(last[1] == cur[1] && last[3] == cur[3] && last[2] + 1 >= cur[0]) || (last[0] == cur[0] && last[2] == cur[2] && last[3] + 1 >= cur[1]); if (canBeMerge) ...{ list.remove(j); list.remove(i); keyList.remove(j); keyList.remove(i); list.add(i, new int[] ...{ last[0], last[1], cur[2], cur[3] }); keyList.add(i, curKey); i--; break; } } } } } return list; } /** *//** * 转换矩阵类型 */ public static String[][] convert(Object[][] dd, boolean force) ...{ if (dd == null) ...{ return null; } else if (dd.length == 0) ...{ return new String[][] ...{}; } int rows = dd.length; int cols = dd[0].length; String[][] dd2 = new String[rows][cols]; for (int i = 0; i < rows; i++) ...{ for (int j = 0; j < cols; j++) ...{ if (force) ...{ dd2[i][j] = (String) dd[i][j]; } else ...{ dd2[i][j] = String.valueOf(dd[i][j]); } } } return dd2; } /** *//** * * @param value1 * @param value2 * @return */ public static boolean equalsTo(Object value1, Object value2,boolean withNullEq) ...{ if(value2==null)...{ return withNullEq?value1==null:false; }else...{ return value2.equals(value1); } } public static boolean equals(Object value1, Object value2) ...{ if(value1==null||value2==null)...{ return true; } return value1.equals(value2); } /** *//** * 插入列 * * @param dd * 矩阵 * @param insertIndex * 插入位置 * @param count * 插入列数 * @param defaultValue * 插入元素的缺省值 * @return */ public static Object[][] insertColumns(Object[][] dd, int insertIndex, int count, Object defaultValue) ...{ if (dd == null || dd.length == 0) ...{ return dd; } int rows = dd.length; int cols = dd[0].length; int toColumnIndex = insertIndex + count; Object[][] dd2 = new Object[rows][cols + count]; for (int i = 0; i < rows; i++) ...{ for (int j = 0, n = cols + count; j < n; j++) ...{ if (j <= insertIndex) ...{ dd2[i][j] = dd[i][j]; } else if (j <= toColumnIndex) ...{ dd2[i][j] = defaultValue; } else ...{ dd2[i][j] = dd[i][j - count]; } } } return dd2; } /** *//** * 删除列 * * @param dd * 矩阵 * @param ix * 要删除的列索引数组 * @return */ public static Object[][] removeColumns(Object[][] dd, int[] ix) ...{ if (dd == null || dd.length == 0) ...{ return dd; } int rows = dd.length; int cols = dd[0].length; Object[][] dd2 = new Object[rows][cols - ix.length]; int n = -1; boolean canBeRemove = false; for (int i = 0; i < cols; i++) ...{ canBeRemove = false; for (int k = 0; k < ix.length; k++) ...{ if (i == ix[k]) ...{ canBeRemove = true; break; } } if (canBeRemove) ...{ continue; } n++; for (int j = 0; j < rows; j++) ...{ dd2[j][n] = dd[j][i]; } } return dd2; } public static Object[][] removeRows(Object[][] dd, int[] ix) ...{ if (dd == null || dd.length == 0) ...{ return dd; } int rows = dd.length; int cols = dd[0].length; Object[][] dd2 = new Object[rows - ix.length][cols]; int n = -1; boolean canBeRemove = false; for (int i = 0; i < rows; i++) ...{ canBeRemove = false; for (int k = 0; k < ix.length; k++) ...{ if (i == ix[k]) ...{ canBeRemove = true; break; } } if (canBeRemove) ...{ continue; } n++; for (int j = 0; j < cols; j++) ...{ dd2[n][j] = dd[i][j]; } } return dd2; }}