`
Gavin.Chen
  • 浏览: 325780 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

一个简单的矩阵存储模型类

阅读更多

  昨天一个同事问了一个问题,涉及到如何设计一个矩阵存储模型的问题,当时想了一些,但都不能很好的解决这个问题,也比较复杂,后来仔细想了一下,便写了下面这个类,比较简单,也能满足基本的应用。

import java.util.HashMap;
import java.util.Map;
/**
 *
 * @author Dao
 */
public class RectStoreModel 
{
  private int maxRow = 0;
  private int maxColumn = 0;
  private Map objectMap = new HashMap();
  
  public RectStoreModel()
  {
    
  }
  
  public String getKey(int row, int column)
  {
    return row + "," + column;
  }
  
  public int getMaxRow()
  {
    return this.maxRow;
  }
  
  public void setMaxRow(int row)
  {
    if (row > this.maxRow)
    {
      this.maxRow = row;
    }
  }
  
  public int getMaxColumn()
  {
    return this.maxColumn;
  }
  
  public void setMaxColumn(int column)
  {
    if (column > this.maxColumn)
    {
      this.maxColumn = column;
    }
  }
  
  public Object retriveObject(int row, int column)
  {
    String key = getKey(row, column);
    
    return this.objectMap.get(key);
  }
  
  public Object storeObject(int row, int column, Object object)
  {
    setMaxRow(row);
    setMaxColumn(column);
    
    String key = getKey(row, column);
    
    return this.objectMap.put(key, object);
  }
}

 测试类

/**
 *
 * @author Dao
 */
public class Main
{

  public static void main(String[] args)
  {
    String str1 = "str1";
    String str2 = "str2";
    String str3 = "str3";
    String str4 = "str4";
    
    RectStoreModel rectStoreModel = new RectStoreModel();
    rectStoreModel.storeObject(1, 10, str1);
    rectStoreModel.storeObject(3, 33, str2);
    rectStoreModel.storeObject(1, 39, str3);
    rectStoreModel.storeObject(5, 20, str4);
    
    int maxRow = rectStoreModel.getMaxRow();
    int maxColumn = rectStoreModel.getMaxColumn();
    
    for (int row = 0; row <= maxRow; row++)
    {
      for (int column = 0; column <= maxColumn; column++)
      {
        Object object = rectStoreModel.retriveObject(row, column);
        
        System.out.print("[");
        if (object != null)
        {
          System.out.print((String) object);
        }
        System.out.print("]");
      }
      
      System.out.println("");
    }
  }
}

  测试结果

[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[][][][][][][][][][][str1][][][][][][][][][][][][][][][][][][][][][][][][][][][][][str3]
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][str2][][][][][][]
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
[][][][][][][][][][][][][][][][][][][][][str4][][][][][][][][][][][][][][][][][][][]

 

 下面再对其进行升级,添加整行整列的操作等

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

/**
 * 矩阵存取模型,以行列坐标定位,可无限延行与列,并有删除整行、整列的操作
 * 还有插入空行、空列的操作,简单,存取数据效率高,可在多种应用环境下作矩阵数据结构使用
 * @author Dao
 */
public class RectStoreModel 
{
  private int maxRow = 0;
  private int maxColumn = 0;
  private Map objectMap = new HashMap();
  
  public RectStoreModel()
  {
    
  }
  
  /**
   * 此方法用于取得存取的某一坐标的存取关键字
   */
  private String getKey(int row, int column)
  {
    return row + "," + column;
  }
  
  /**
   * 强制删除最后一列,最后一列的数据将会丢失
   */
  public void decreaseColumn()
  {
    removeColumn(this.maxColumn);
  }
  
  /**
   * 强制删除最后一行,最后一行的数据将会丢失
   */
  public void decreaseRow()
  {
    removeRow(this.maxRow);
  }
  
  /**
   * 取得最大列列号,从0开始算
   */
  public int getMaxColumn()
  {
    return this.maxColumn;
  }
  
  /**
   * 设置最大列,如果新的最大列大于原有的最大列,则矩阵将会自动以空单元填充
   * 如果新的最大列小于或等于原有的最大列,则矩阵将保持不变
   */
  public void setMaxColumn(int column)
  {
    if (column > this.maxColumn)
    {
      this.maxColumn = column;
    }
  }
  
  /**
   * 取得最大行行号,从0开始算
   */
  public int getMaxRow()
  {
    return this.maxRow;
  }
  
  /**
   * 设置最大行,如果新的最大行号大于原有的最大行,则矩阵将会自动以空单元填充
   * 如果新的最大行小于或等于原有的最大行,则矩阵将保持不变
   */
  public void setMaxRow(int row)
  {
    if (row > this.maxRow)
    {
      this.maxRow = row;
    }
  }
  
  /**
   * 得到现有列总数,与getMaxColumn()不同,getColumnCount()是从1开始,得到的是列的总数
   * 其实就是最大列号 + 1;
   */
  public int getColumnCount()
  {
    return this.maxColumn + 1;
  }
  
  /**
   * 得到现有行总数,与getMaxRow()不同,getRowCount()是从1开始,得到的是行的总数
   * 其实就是最大行号 + 1
   */
  public int getRowCount()
  {
    return this.maxRow + 1;
  }
  
  /**
   * 取得现在矩阵中存放的数据个数,不计空白单元
   */
  public int getObjectCount()
  {
    int objectCount = 0;
    
    for (int row = 0; row <= this.maxRow; row++)
    {
      for (int column = 0; column <= this.maxColumn; column++)
      {
        String key = getKey(row, column);
        
        if (this.objectMap.containsKey(key))
        {
          objectCount++;
        }
      }
    }
    
    return objectCount;
  }
  
  /**
   * 在末尾增加一列
   */
  public void increaseColumn()
  {
    this.maxColumn++;
  }
  
  /**
   * 在最后添加一新列
   */
  public void increaseRow()
  {
    this.maxRow++;
  }
  
  /**
   * 在中间插入一列,该列及以后的列的数据将被往后推移
   * @param insertColumn 在插入的列号
   */
  public void insertColumn(int insertColumn)
  {
    if (insertColumn > 0)
    {
      if (insertColumn <= this.maxColumn)
      {
        for (int row = 0; row <= this.maxRow; row++)
        {
          for (int column = this.maxColumn; column >= insertColumn; column--)
          {
            Object object = retriveObject(row, column);

            storeObject(row, column + 1, object);
          }
          
          removeObject(row, insertColumn);
        }
      
        this.maxColumn++;
      }
      else
      {
        this.maxColumn = insertColumn;
      }
    }
  }
  
  
  /**
   * 在中间插入一行,该行及以后的行的数据将被往后推移
   * @param inserRow 在插入的行号
   */
  public void insertRow(int inserRow)
  {
    if (inserRow > 0)
    {
      if (inserRow <= this.maxRow)
      {
        for (int row = this.maxRow; row >= inserRow; row--)
        {
          for (int column = 0; column <= this.maxColumn; column++)
          {
            Object object = retriveObject(row, column);
            
            storeObject(row + 1, column, object);
            
            if (row == inserRow)
            {
              removeObject(row, column);
            }
          }
        }
      }
      else
      {
        this.maxRow = inserRow;
      }
    }
  }
  
  /**
   * 删除某坐标对应的数据
   */
  public Object removeObject(int row, int column)
  {
    String key = getKey(row, column);
    
    return this.objectMap.remove(key);
  }
  
  /**
   * 删除某一列的数据
   */
  public void removeColumn(int removeColumn)
  {
    if (removeColumn > 0 && removeColumn <= this.maxColumn)
    {
      for (int row = 0; row <= this.maxRow; row++)
      {
        for (int column = removeColumn; column < this.maxColumn; column++)
        {
          Object object = retriveObject(row, column + 1);
          
          storeObject(row, column, object);
        }
        
        removeObject(row, this.maxColumn);
      }
      
      this.maxColumn--;
    }
  }
  
  /**
   * 删除某一行的数据
   */
  public void removeRow(int removeRow)
  {
    if (removeRow > 0 && removeRow <= this.maxRow)
    {
      for (int column = 0; column <= this.maxColumn; column++)
      {
        for (int row = removeRow; row < this.maxRow; row++)
        {
          Object object = retriveObject(row + 1, column);
          
          storeObject(row, column, object);
        }
        
        removeObject(this.maxRow, column);
      }
      
      this.maxRow--;
    }
  }
  
  /**
   * 取得对应坐标下的数据
   */
  public Object retriveObject(int row, int column)
  {
    String key = getKey(row, column);
    
    return this.objectMap.get(key);
  }
  
  /**
   * 将数据存于某一坐标下
   */
  public Object storeObject(int row, int column, Object object)
  {
    setMaxRow(row);
    setMaxColumn(column);
    
    String key = getKey(row, column);
    
    return this.objectMap.put(key, object);
  }
}

 

分享到:
评论

相关推荐

    [JWFD开源工作流]大规模拓扑矩阵存储结构最新进展

    标题中的 "[JWFD开源工作流]大规模拓扑矩阵存储结构最新进展" 指向的是一个关于开源工作流系统中处理大规模拓扑矩阵存储结构的更新或改进。这种存储结构对于处理复杂的工作流程和数据关系至关重要,尤其是在图计算、...

    C++实现简单矩阵类.rar

    本资源“C++实现简单矩阵类.rar”提供了一个轻量级的矩阵类实现,便于进行矩阵的加减乘除及求逆等基本运算。下面我们将详细探讨这些知识点。 1. **矩阵类设计**: - 在C++中,创建一个矩阵类通常需要包含矩阵元素...

    Qt OpenGL 缩放矩阵,旋转矩阵 移动矩阵.mat4x4

    通常,我们会使用QMatrix4x4类来存储和操作这些矩阵,因为它提供了方便的方法来实现缩放、旋转和移动。最后,通过调用glDrawArrays或glDrawElements等函数,我们可以让OpenGL渲染图形。 在"rotMat"这个文件中,可能...

    MapReduce实现矩阵相乘算法

    总之,使用Hadoop MapReduce实现矩阵相乘是一个涉及并行计算、分布式存储和高效数据处理的综合问题,它展示了MapReduce在处理大规模数值计算时的强大能力。通过理解并实践这一算法,开发者可以更好地掌握大数据处理...

    J基于C++矩阵类

    `InfoMatrix`类被定义为一个存储二维整型向量的容器,可以用来表示矩阵。其内部使用了`std::vector&lt;std::vector&lt;int&gt;&gt;`来存储矩阵数据。此外,还包括了一些辅助成员变量用于保存特定计算结果(例如:测试权重和隔离...

    基于MapReduce的矩阵相乘算法代码及其使用

    - 如果是矩阵 B,则同样遍历每一行的每一个元素,对于每个元素,生成键值对,键为 `(行号,列号)`,值为 `"b,行号,元素值"`。 ##### 4.2 MMReducer 类详解 MMReducer 类继承自 `Reducer` 抽象类,并重写了 `reduce...

    空间权重矩阵(地级市、省级四种空间权重矩阵)

    `.7z` 是一种高压缩率的文件存档格式,用于打包多个相关文件,节省存储空间,同时提供解压时的数据完整性检查。 综合这些矩阵,研究者可以深入理解中国地区间的空间关联性,识别经济热点和冷点,探索区域发展的不...

    邻接矩阵_邻接矩阵_生成邻接矩阵_additione2k_复杂网络_

    这个文件应该定义了一个函数或类,接受一个表示图的边集(可能是边的列表或元组),并返回一个表示邻接矩阵的二维列表或NumPy数组。 **复杂网络** 复杂网络是指具有非平凡拓扑结构的网络,这些结构往往不能被简单...

    C++矩阵变换操作平移、旋转、镜像

    一个矩阵可以看作是一个二维数组,它能够存储一组数值。在图形学中,通常使用4x4的浮点数矩阵来表示变换。这种矩阵可以用于平移、旋转、缩放和投影等多种操作。 1. **平移**:平移是在三维空间中移动物体的关键操作...

    n矩阵(加减乘除)

    对于本项目,我们可能会看到一个名为`Matrix`的类,它包含矩阵的行数、列数以及存储元素的数据结构。 1. **矩阵加法**:矩阵加法是将两个具有相同维度的矩阵的对应元素相加。在C++中,可以通过遍历两个矩阵的每个...

    基于Hadoop的高速公路OD数据存储模型和计算方法

    针对高速公路OD数据的种类多、周期长等问题,提出一种基于Hadoop的高速公路OD矩阵存储模型和相应的计算方法.建立统计高速公路车辆旅行时间、统计高速公路车流量两类OD矩阵作为存储模型.通过基于海量真实的高速公路...

    CUDA矩阵操作

    矩阵乘法是另一个关键操作,尤其是在图像处理、机器学习和物理模拟等领域。CUDA的CuBLAS库提供了一个高效的矩阵乘法实现,即cuBLAS的`gemm`函数。但这里提到的库可能是自定义实现,通过直接编程控制GPU的线程来优化...

    实数及复数矩阵加法并行CUDA

    在CUDA中处理复数时,我们需要定义一个新的数据结构(如自定义的复数类)以存储实部和虚部,然后修改内核函数来处理这些复数元素的加法。 MATLAB Cmex混合编程允许我们利用MATLAB的便捷性和C++的高性能。MATLAB可以...

    矩阵相乘(含有很多0)

    在计算机科学和数学领域,矩阵乘法是一种基本运算,它在图像处理、机器学习、线性代数等众多领域有着广泛的应用。当我们处理的矩阵中含有大量零元素时,传统的矩阵乘法算法会浪费大量计算资源,因为每个非零元素都...

    矩阵十个经典类型的解法

    2. **对角矩阵**:只有主对角线上的元素非零的矩阵,解法通常简化为单独处理每个主对角线元素,使得问题变得简单。 3. **上三角矩阵**与**下三角矩阵**:这类矩阵的解法利用了高斯消元法,从上至下或从下至上的迭代...

    无穷嵌套矩阵运算在Matlab中的实现.pdf

    在Matlab中,嵌套矩阵即是指每个元素本身又是一个矩阵,这种结构在某些特定数学模型中很常见,例如QBD过程和Markov模型等。在这些情况下,传统的编程语言如C和Java难以表示和运算这类矩阵结构。 文章中提到的单元...

    solvey_导纳_case14导纳矩阵_matlab_matpower_节点导纳矩阵_源码

    在电力系统分析中,导纳矩阵是至关重要的概念,它描述了电力网络中各个节点之间的电气关系。本项目“solvey_导纳_case14导纳矩阵_matlab_...同时,这也为我们提供了一个基础,以便扩展到更大规模的电力系统模型。

    非负矩阵与张量分解及其应用

    1. 给出了基于轮换极小化原则的一个非负矩阵分解二次规划模型算法。 借助于内点 罚函数,把子问题的求解转化为一个无约束的二次规划问题模型来求解,再把二次规划 模型求解归结到一个线性方程组的求解,在求解过程...

Global site tag (gtag.js) - Google Analytics