`

关于返回二维数组排序后序号数组的问题求解

阅读更多
package com.cdl.matrix;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 *@source:http://blog.csdn.net/justinavril/archive/2009/12/14/5003467.aspx
 * 
 *@function: 矩阵A
 * 
 *            68 36 22
 * 
 *            59 77 39
 * 
 *            81 20 17
 * 
 *            将矩阵A每列排序之后(升序排列)应该得到的矩阵是:
 * 
 *            矩阵B:
 * 
 *            59 20 17
 * 
 *            68 36 22
 * 
 *            81 77 39
 * 
 *            这样矩阵A中每个元素在矩阵B中对应的位置就是
 * 
 *            矩阵C:
 * 
 *            2 3 3
 * 
 *            1 1 1
 * 
 *            3 2 2
 * 
 *            问:由矩阵A得到矩阵C的算法?
 * 
 * @author ocaicai@yeah.net 2011-6-27
 * 
 */
public class MatrixColSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[][] initArray = { { 68, 36, 22 }, { 59, 77, 39 }, { 81, 20, 17 } };
		System.out.println("原来的数组:");
		printArray(initArray);
		System.out.println("排序后的数组:");
		MatrixElement[][] transferedArray = transferByElement(initArray);
		MatrixElement[][] sortedArray = sortArrayCols(transferedArray);
		int[][] targerArray = getRowsArray(sortedArray);
		printArray(targerArray);
	}

	/**
	 * 将数组中单个的value转换成Element(value,rowIndex)
	 * 
	 * @param sourceArray
	 * @return
	 */
	public static MatrixElement[][] transferByElement(int[][] sourceArray) {
		int rows = sourceArray.length;
		int cols = sourceArray[0].length;
		MatrixElement[][] elementArray = new MatrixElement[rows][cols];
		for (int row = 0; row < rows; row++) {
			for (int col = 0; col < cols; col++) {
				elementArray[row][col] = new MatrixElement(
						sourceArray[row][col], row + 1);
			}
		}
		return elementArray;
	}

	/**
	 * 获取某一列的值存入一个临时的tempList中,
	 * 
	 * 然后对这个tempList赋整列的值然后对其排序,
	 * 
	 * 再把排序后的tempList赋值回列去
	 * 
	 * @param elementArray
	 *            被转换的对象
	 * @return
	 */
	public static MatrixElement[][] sortArrayCols(MatrixElement[][] elementArray) {
		int rows = elementArray.length;
		int cols = elementArray[0].length;

		for (int colIndex = 0; colIndex < cols; colIndex++) {
			List<MatrixElement> tempList = new ArrayList<MatrixElement>();
			for (int rowIndex = 0; rowIndex < rows; rowIndex++) {
				tempList.add(elementArray[rowIndex][colIndex]);
			}
			Collections.sort(tempList);
			for (int rowIndex = 0; rowIndex < rows; rowIndex++) {
				elementArray[rowIndex][colIndex] = tempList.get(rowIndex);
			}
		}
		return elementArray;
	}

	/**
	 * @param elementArray
	 *            从其中获取rowIndex,做成一个数组返回去
	 * @return
	 */
	public static int[][] getRowsArray(MatrixElement[][] elementArray) {
		int rows = elementArray.length;
		int cols = elementArray[0].length;
		int[][] rowArray = new int[rows][cols];
		for (int row = 0; row < rows; row++)
			for (int col = 0; col < cols; col++)
				rowArray[row][col] = elementArray[row][col].getRowIndex();
		return rowArray;
	}

	/**
	 * 打印二维数组
	 * 
	 * @param array
	 */
	public static void printArray(int[][] array) {
		for (int i = 0; i < array.length; i++)
			System.out.println(Arrays.toString(array[i]));
	}
}



使用到的MatrixElement类:

package com.cdl.matrix;

public class MatrixElement implements Comparable<MatrixElement> {
	int value;
	int rowIndex;

	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		this.value = value;
	}

	public int getRowIndex() {
		return rowIndex;
	}

	public void setRowIndex(int rowIndex) {
		this.rowIndex = rowIndex;
	}

	public MatrixElement(int value, int rowIndex) {
		this.value = value;
		this.rowIndex = rowIndex;
	}

	@Override
	public int compareTo(MatrixElement anotherEmlement) {
		//比较只需要对value比较
		int valueCmp = this.value - anotherEmlement.value;
		return valueCmp;
	}
}



输出结果:

原来的数组:
[68, 36, 22]
[59, 77, 39]
[81, 20, 17]
排序后的数组:
[2, 3, 3]
[1, 1, 1]
[3, 2, 2]






.


分享到:
评论

相关推荐

    背包问题求解方法综述.doc

    对于0-1背包问题,可以构建一个二维数组\(dp[i][j]\),其中\(dp[i][j]\)表示前i个物品在背包容量为j的情况下可以获得的最大价值。利用动态规划公式更新\(dp\)数组。 **核心公式**: - \(dp[i][j] = \max(dp[i-1][j...

    图练习与答案 (2).docx

    邻接矩阵是一个二维数组,表示每个顶点与其他顶点是否有边相连;邻接链表则是为每个顶点创建一个链表,链表中的元素表示与其相邻的顶点。 2. 图的遍历:图的遍历主要有深度优先搜索(DFS)和广度优先搜索(BFS)两种。...

    222018321062006宋行健 实验二1

    在这个实验中,使用二维数组模拟棋盘,每个元素代表一个格子。 伪码算法大致如下: 1. 设置初始骨牌序号和棋盘数组。 2. 设定递归函数`chessBoard`,参数包括棋盘的左上角坐标、特殊方格的位置和棋盘大小。 3. 当...

    matlab 习题matlab 习题.doc

    例如,`[y, i] = max(a, [], 2)` 是沿着第二维(列)寻找最大值(这里用于每门课程找最高分),`[z, j] = max(d, [], 2)` 是对三门课总分求最大值及其索引。 2. 总分排序: `sum(a)` 计算每个学生三门课的总分,`...

    数据结构](1).doc

    - `sum1` 函数要求计算二维数组 A[m][n] 的边缘元素之和。边缘元素包括数组的第一行、最后一行、第一列和最后一列的元素。 - `sum2` 函数需找到数组中从 A[0][0] 开始的所有互不相邻的元素之和。互不相邻意味着...

    ACM常用模板及北大ACM-题型分类代码

    - **定义**: 类似于子段和问题,但针对二维数组。 - **应用场景**: 在图像处理、数据分析等领域。 - **实现方法**: - 同样可以采用动态规划的方法。 #### 字典序全排列与序号的转换 - **定义**: 给定一组元素,求...

    输入两个正整数m和n求其最大公约数和最小公倍数.docx

    - 包括矩阵对角线元素之和、元素平均值、最大值等,这些都涉及到二维数组的遍历和计算。 23-24. 矩阵元素最大值: - 对于矩阵中的元素,找到最大值及其位置。 25. 矩阵对称性检测: - 检查矩阵的对角线元素与其...

    6-1算法DepthFirstSearch1

    邻接矩阵是存储图的一种方法,它通过二维数组来表示图中各个顶点之间的连接关系。在`Graph_Matrix`类中,邻接矩阵`edge`被用来存储图的边信息,其中`edge[i][j]`的值表示顶点i到顶点j的权值,如果图是无向的,`edge...

    《Excel应用大全》示例文件 光盘文件

    • 使用两个一维数组构造二维数组 • 部门评价等级转换 • 使用MMULT 函数计算产品结构指数 • 产生1-10 的自然数垂直序列和水平序列 • 等比例构造一维循环数组 • SUMIF函数对产品产量进行逐行汇总 • 利用MMULT...

    c语言试题100道.doc

    33. 二维数组的输入输出,需要理解数组的存储方式和指针操作。 34. 学生成绩管理,涉及查找最高分和对应的学生序号。 35. 冒泡排序,通过交换相邻元素实现升序排列。 36. 选择排序,通过找到未排序部分的最大值并...

    MATLAB_code.zip_finite element_有限元_边界元

    代码可能还涉及到网格生成,如使用`delquad`或第三方工具如`Triangle`来生成二维有限元网格。 总的来说,这个压缩包提供了一种使用MATLAB解决微分边界问题的途径,结合有限元和可能的边界元概念。通过对“MATLAB_...

    数据结构课程设计

    7、迷宫求解:用二维矩阵表示迷宫,自动生成或者直接输入迷宫的格局,确定迷宫是否能走通,如果能走通,输出行走路线。 8、英国人格思里于1852年提出四色问题(four colour problem,亦称四色猜想),即在为一平面或...

    acm 错误集

    文件指出,当尝试通过`void insert(char tmp[])`这样的方式传递二维字符数组时,直接使用`insert(str[i])`会导致编译错误。 **解决方案与注意事项:** - 传递指针而非值:使用`insert(str[i])`时,实际上传递的是...

    数据结构与算法 (JAVA语言版)

    - 使用二维数组表示图的存储方式。 - **4.5.2 邻接表** - 使用链表表示图的存储方式。 - **4.5.3 双链式存储结构** - 结合了邻接矩阵和邻接表的优点。 **4.6 图ADT实现设计** - 设计图的抽象数据类型。 **4.7 ...

    22春“计算机科学与技术”专业《数据结构》在线作业含答案参考1.docx

    4. **数组的存储**:二维数组A[50][60]按行优先顺序存储,元素长度为4字节,A[18][25]的地址可以通过公式计算得出,这里给出的答案是D.4620。 5. **逻辑结构与存储方式**:数据的逻辑结构描述的是数据元素间的逻辑...

    C语言通用范例开发金典.part1.rar

    1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 ...

    C语言通用范例开发金典.part2.rar

    1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 ...

    C 开发金典

    1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 ...

    设有一有向图为g(vdoc.pdf

    2. **邻接矩阵的应用**:对于无向图,邻接矩阵是一个二维数组,用于表示图中各个顶点之间的连接关系。它可以用以下方式解决问题: - (1) 边的数量可以通过计算矩阵中非零元素的数量得出。 - (2) 两个顶点之间是否...

Global site tag (gtag.js) - Google Analytics