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