矩阵转换


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

}


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值