本帖最后由 app297 于 2014-1-13 17:35 编辑
这个是我看完教程写的一个数组工具类,但是,出错,下面注释部分
- public class Test {
- public static void main(String[] args) {
- int[] arr = {20,8,7,3,2,90,100};
- //System.out.println(ArrayTool.getNumFirst(arr, "min"));
- //求解:只要加上上面这句,打印数组功能就会出错,现在上面这句的结果是 2, 下面打印元素的话,第一个元素 就会变成2.
- //我看了好久都没看出来锉刀哪里。。
- ArrayTool.print(arr); //打印数组元素
- ArrayTool.selectSort(arr,"maxToMin"); //降序
- //ArrayTool.bubUpSort(arr, "minToMax"); //升序
- ArrayTool.print(arr);
- System.out.println(ArrayTool.binaryChop(arr, 4));
- }
- }
- /**
- * 数组工具类,找出数组中的最大值、最小值;选择排序法、冒泡排序法;二分查找法;
- * */
- class ArrayTool{
- //该类没有成员变量,所以全部定义成staic函数,以便节约内存空间
- /**找出数组中的最大值或最小值,
- * first : 接收指令: max 返回最大值,min:返回最小值
- * */
- public static int getNumFirst(int[] arr,String first){
- int index = 0; //记录角标
- for(int x = 0 ;x <arr.length;x++){
- if(first.equals("max")){
- if(arr[x] > arr[index]){ //最大值
- arr[index] = arr[x];
- }
- }else if(first.equals("min")){
- if(arr[x] < arr[index]){ //最小值
- arr[index] = arr[x];
- }
- }else{
- System.out.println("请输入正确的参数,first : 接收指令: max 返回最大值,min:返回最小值");
- }
- }
- return arr[index];
- }
- /**
- * 选择排序法;
- * first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)
- * */
- public static void selectSort(int[] arr,String first){
- for (int i = 0; i < arr.length; i++) {
- for (int j = i+1; j < arr.length; j++) {
- if("maxToMin".equals(first)){//降序
- if(arr[i] < arr[j]){
- swap(arr,i,j);
- }
- }else if("minToMax".equals(first)){//升序
- if(arr[i] > arr[j]){
- swap(arr,i,j);
- }
- }else{
- System.out.println("请输入正确的参数:first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)");
- return;
- }
- }
- }
- }
- /**
- * 冒泡排序法;
- * first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)
- * */
- public static void bubUpSort(int[] arr,String first){
- for (int i = 0; i < arr.length; i++) {
- for (int j = 0; j < arr.length -1; j++) {
- if("maxToMin".equals(first)){ //降序
- if(arr[j] < arr[j+1]){
- swap(arr, i, j+1);
- }
- }else if("minToMax".equals(first)){ //升序
- if(arr[j] > arr[j+1]){
- swap(arr, j, j+1);
- }
- }else{
- System.out.println("请输入正确的参数:first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)");
- }
- }
- }
- }
- /**
- * 数组位置交换
- * */
- //这里定义成private修饰,是因为,该函数,只是本类中使用的,不能让外部使用。
- private static void swap(int[] arr,int i,int j){
- int temp;
- temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- /**
- * 折半查找法,二分查找法,返回该key在数组中的位置,
- * 未找到则返回 负数,并且返回的结果 的绝对值 -1 则是该数应该存在的位置。
- * 二分查找法,必须是有序的
- * */
- public static int binaryChop(int[] arr,int key){
- int min = 0; //最小角标
- int max = arr.length -1; //最大角标
- int index = (min + max)/2; //折半后的index 指针
- while(max > min){ //条件不成立的话则表示,未找到
- if(key == arr[index]){
- return index;
- }
- if(key > arr[index]){
- min = index +1; //这里无限为真 ,结合下面的注释语句
- }else if(key < arr[index]){
- max = index -1; //这里就执行不到了。
- }else{
- return index;
- }
- index = (min + max)/2; //一定要记住这句,不然上面的条件
- }
- return -min-1;
- }
- /**
- * 打印数组中的元素
- * */
- public static void print(int[] arr){
- System.out.print("[");
- for(int i = 0; i < arr.length;i++){
- if(i == arr.length-1){ //处理最后一个角标的显示风格
- System.out.print(arr[i] + "]");
- }else{
- System.out.print(arr[i] + ",");
- }
- }
- System.out.println();
- }
- }
复制代码
|