版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JusterDu/article/details/52052818
程序包括两个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