编写一个程序解决选择问题

程序包括两个Java文件:

1.主文件:Ex1_1.java

package exercise;

import util.ConsoleTable;

/**
 * @author Justerdu 
 * 编写一个程序解决选择问题 
 * 解读:将给定数组的数值先排序,然后取出第k=N/2个值。
 * 思路:采用冒泡排序或者插入排序法,复杂度为O(N^2)
 */
public class Ex1_1 {

	/**
	 * Func: 主函数
	 * @param args
	 */
	public static void main(String[] args) {
		
		int a1[] = {1,4,2,34,12,5,76,33,9,18};
		int a2[] = {1,41,2,34,12,5,32,344,152,56,776,383,99,180,76,33,9,133,29,18};
		int a3[] = {1,41,2,34,12,5,32,344,152,56,776,383,99,180,76,33,9,133,29,18,17,417,28,394,192,50,323,3444,122,26,746,323,919,120,746,13,95,173,23,68};
		
		ConsoleTable t = new ConsoleTable(2, true);
		t.appendRow();
		t.appendColum("Instance").appendColum("Run Time");

		t.appendRow();
		t.appendColum("a1").appendColum(getRuntime(a1) + "ns");
		
		t.appendRow();
		t.appendColum("a2").appendColum(getRuntime(a2) + "ns");
		
		t.appendRow();
		t.appendColum("a3").appendColum(getRuntime(a3) + "ns");

		System.out.println(t.toString());

	}
	
	/**
	 * Func: 获取运行时间
	 * @param arr
	 * @return
	 */
	public static long getRuntime(int arr[]){
		long startTime = System.nanoTime();   //获取开始时间 ns
		getMedianValue(arr);
		long endTime = System.nanoTime(); //获取结束时间 ns 
		long runtime = (endTime - startTime);
//		System.out.println("运行时间: "+ runtime + "ns");
		return runtime;
	}
	
	/**
	 * Func: 找出数组中间值
	 * @param arr
	 * @return
	 */
	public static int getMedianValue(int arr[]){
		sort(arr);
		int medianValue = arr[arr.length / 2 - 1];
//		System.out.println("第k个值: " + medianValue);
		return medianValue;
	}

	/**
	 * Func: 冒泡排序法
	 * @param arr
	 * @return
	 */
	public static int[] sort(int arr[]) {
		int temp = 0;
		for (int i = 0; i < arr.length; i++) {
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[i] > arr[j]) {
					temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		/*System.out.print("排序结果: ");
		for(int i =0; i < arr.length; i++){
			System.out.print(arr[i] + " ");
		}
		System.out.println();*/
		return arr;
	}
	

}<span style="font-family:楷体;"><span style="font-size: 22px; line-height: 33px;">
</span></span>

2.工具类:ConsoleTable.java
<pre name="code" class="java">package util;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Justerdu
 * 描述: 生成控制台表格
 * 记录:  当元素为中文时,会出现不对齐情况,主要是由于中文一个汉字的字节数虽然为2,但其在控制台所占字符空间并不为2。
 *
 */
public class ConsoleTable {

	@SuppressWarnings("rawtypes")
	private List<List> rows = new ArrayList<List>();	// table

	private int colum;	// 列长
	
	private int[] columLen;	// 存储每一列的长度

	private static int margin = 2;	// 内容与边框间距

	private boolean printHeader = false;	// 是否打印表头

	/**
	 * @param colum
	 * @param printHeader
	 */
	public ConsoleTable(int colum, boolean printHeader) {
		this.printHeader = printHeader;
		this.colum = colum;
		this.columLen = new int[colum];
	}

	/**
	 * Func: 添加行
	 */
	public void appendRow() {
		List row = new ArrayList(colum);
		rows.add(row);
	}

	/**
	 * Func: 添加列元素
	 * @param value
	 * @return
	 */
	public ConsoleTable appendColum(Object value) {
		if (value == null) {
			value = "NULL";
		}
		List row = rows.get(rows.size() - 1);	// 每一行的元素集
		row.add(value);
		int len = value.toString().getBytes().length;
		if (columLen[row.size() - 1] < len)
			columLen[row.size() - 1] = len;
		return this;	// 返回当前对象
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 * Func: 复写toString()方法,用于打印出控制台表格
	 */
	public String toString() {
		
		StringBuilder buf = new StringBuilder();

		int sumlen = 0;
		for (int len : columLen) {
			sumlen += len;
		}
		if (printHeader)
			buf.append("|")
					.append(printChar('=', sumlen + margin * 2 * colum
							+ (colum - 1))).append("|\n");
		else
			buf.append("|")
					.append(printChar('-', sumlen + margin * 2 * colum
							+ (colum - 1))).append("|\n");
		for (int ii = 0; ii < rows.size(); ii++) {
			List row = rows.get(ii);
			for (int i = 0; i < colum; i++) {
				String o = "";
				if (i < row.size())
					o = row.get(i).toString();
				buf.append('|').append(printChar(' ', margin)).append(o);
				buf.append(printChar(' ', columLen[i] - o.getBytes().length
						+ margin));
			}
			buf.append("|\n");
			if (printHeader && ii == 0)
				buf.append("|")
						.append(printChar('=', sumlen + margin * 2 * colum
								+ (colum - 1))).append("|\n");
			else
				buf.append("|")
						.append(printChar('-', sumlen + margin * 2 * colum
								+ (colum - 1))).append("|\n");
		}
		return buf.toString();
	}

	/**
	 * Func: 打印给定长度的字符
	 * @param c
	 * @param len
	 * @return
	 */
	private String printChar(char c, int len) {
		StringBuilder buf = new StringBuilder();
		for (int i = 0; i < len; i++) {
			buf.append(c);
		}
		return buf.toString();
	}

	public static void main(String[] args) {
		ConsoleTable t = new ConsoleTable(4, true);
		
		t.appendRow();
		t.appendColum("column 1").appendColum("column 2").appendColum("column 3").appendColum("column 4");
		
		t.appendRow();
		t.appendColum("1").appendColum("2").appendColum("3").appendColum("4");
		
		t.appendRow();
		t.appendColum("asd").appendColum("bwe").appendColum("ce").appendColum("drwrw");

		t.appendRow();
		t.appendColum("张三").appendColum("李四").appendColum("王五").appendColum("周六");
		System.out.println(t.toString());
		
	}

}

 
参考文章:
1.http://www.oschina.net/code/snippet_100347_708
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值