A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© app297 中级黑马   /  2014-1-13 16:43  /  1130 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 app297 于 2014-1-13 17:35 编辑

这个是我看完教程写的一个数组工具类,但是,出错,下面注释部分
  1. public class Test {
  2. public static void main(String[] args) {
  3. int[] arr = {20,8,7,3,2,90,100};
  4. //System.out.println(ArrayTool.getNumFirst(arr, "min"));
  5. //求解:只要加上上面这句,打印数组功能就会出错,现在上面这句的结果是 2, 下面打印元素的话,第一个元素 就会变成2.
  6. //我看了好久都没看出来锉刀哪里。。
  7. ArrayTool.print(arr); //打印数组元素
  8. ArrayTool.selectSort(arr,"maxToMin"); //降序
  9. //ArrayTool.bubUpSort(arr, "minToMax"); //升序
  10. ArrayTool.print(arr);
  11. System.out.println(ArrayTool.binaryChop(arr, 4));

  12. }
  13. }
  14. /**
  15. * 数组工具类,找出数组中的最大值、最小值;选择排序法、冒泡排序法;二分查找法;
  16. * */
  17. class ArrayTool{
  18. //该类没有成员变量,所以全部定义成staic函数,以便节约内存空间
  19. /**找出数组中的最大值或最小值,
  20. * first : 接收指令: max 返回最大值,min:返回最小值
  21. * */
  22. public static int getNumFirst(int[] arr,String first){
  23. int index = 0; //记录角标
  24. for(int x = 0 ;x <arr.length;x++){
  25. if(first.equals("max")){
  26. if(arr[x] > arr[index]){ //最大值
  27. arr[index] = arr[x];
  28. }
  29. }else if(first.equals("min")){
  30. if(arr[x] < arr[index]){ //最小值
  31. arr[index] = arr[x];
  32. }
  33. }else{
  34. System.out.println("请输入正确的参数,first : 接收指令: max 返回最大值,min:返回最小值");
  35. }
  36. }
  37. return arr[index];
  38. }
  39. /**
  40. * 选择排序法;
  41. * first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)
  42. * */
  43. public static void selectSort(int[] arr,String first){
  44. for (int i = 0; i < arr.length; i++) {
  45. for (int j = i+1; j < arr.length; j++) {
  46. if("maxToMin".equals(first)){//降序
  47. if(arr[i] < arr[j]){
  48. swap(arr,i,j);
  49. }
  50. }else if("minToMax".equals(first)){//升序
  51. if(arr[i] > arr[j]){
  52. swap(arr,i,j);
  53. }
  54. }else{
  55. System.out.println("请输入正确的参数:first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)");
  56. return;
  57. }
  58. }
  59. }
  60. }
  61. /**
  62. * 冒泡排序法;
  63. * first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)
  64. * */
  65. public static void bubUpSort(int[] arr,String first){
  66. for (int i = 0; i < arr.length; i++) {
  67. for (int j = 0; j < arr.length -1; j++) {
  68. if("maxToMin".equals(first)){ //降序
  69. if(arr[j] < arr[j+1]){
  70. swap(arr, i, j+1);
  71. }
  72. }else if("minToMax".equals(first)){ //升序
  73. if(arr[j] > arr[j+1]){
  74. swap(arr, j, j+1);
  75. }
  76. }else{
  77. System.out.println("请输入正确的参数:first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)");
  78. }
  79. }
  80. }
  81. }
  82. /**
  83. * 数组位置交换
  84. * */
  85. //这里定义成private修饰,是因为,该函数,只是本类中使用的,不能让外部使用。
  86. private static void swap(int[] arr,int i,int j){
  87. int temp;
  88. temp = arr[i];
  89. arr[i] = arr[j];
  90. arr[j] = temp;
  91. }
  92. /**
  93. * 折半查找法,二分查找法,返回该key在数组中的位置,
  94. * 未找到则返回 负数,并且返回的结果 的绝对值 -1 则是该数应该存在的位置。
  95. * 二分查找法,必须是有序的
  96. * */
  97. public static int binaryChop(int[] arr,int key){
  98. int min = 0; //最小角标
  99. int max = arr.length -1; //最大角标
  100. int index = (min + max)/2; //折半后的index 指针
  101. while(max > min){ //条件不成立的话则表示,未找到
  102. if(key == arr[index]){
  103. return index;
  104. }
  105. if(key > arr[index]){
  106. min = index +1; //这里无限为真 ,结合下面的注释语句
  107. }else if(key < arr[index]){
  108. max = index -1; //这里就执行不到了。
  109. }else{
  110. return index;
  111. }
  112. index = (min + max)/2; //一定要记住这句,不然上面的条件
  113. }
  114. return -min-1;
  115. }
  116. /**
  117. * 打印数组中的元素
  118. * */
  119. public static void print(int[] arr){
  120. System.out.print("[");
  121. for(int i = 0; i < arr.length;i++){
  122. if(i == arr.length-1){ //处理最后一个角标的显示风格
  123. System.out.print(arr[i] + "]");
  124. }else{
  125. System.out.print(arr[i] + ",");
  126. }
  127. }
  128. System.out.println();
  129. }
  130. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 淡定

查看全部评分

5 个回复

倒序浏览
哥们 你在方法中把arr数组的值给改变了啊
每次判断之后会把arr[index]的值变为当前最小的,index一直是0所以就会一直改变数组的第一个值
如果你不想改变数组内容,只想取出最小值  那就别用arr[index]来存储最小值,可以再定义一个变量嘛!
还有  你的index定义为记录角标  那你的程序应该是这样的
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 int[] arr = { 20, 8, 7, 3, 2, 90, 100 };
  4.                  System.out.println(ArrayTool.getNumFirst(arr, "min"));
  5.                 // 求解:只要加上上面这句,打印数组功能就会出错,现在上面这句的结果是 2, 下面打印元素的话,第一个元素 就会变成2.
  6.                 // 我看了好久都没看出来锉刀哪里。。
  7.                 ArrayTool.print(arr); // 打印数组元素
  8.                 ArrayTool.selectSort(arr, "maxToMin"); // 降序
  9.                 // ArrayTool.bubUpSort(arr, "minToMax"); //升序
  10.                 ArrayTool.print(arr);
  11.                 System.out.println(ArrayTool.binaryChop(arr, 4));

  12.         }
  13. }

  14. /**
  15. * 数组工具类,找出数组中的最大值、最小值;选择排序法、冒泡排序法;二分查找法;
  16. * */
  17. class ArrayTool {
  18.         // 该类没有成员变量,所以全部定义成staic函数,以便节约内存空间
  19.         /**
  20.          * 找出数组中的最大值或最小值, first : 接收指令: max 返回最大值,min:返回最小值
  21.          * */
  22.         public static int getNumFirst(int[] arr, String first) {
  23.                 int index = 0; // 记录角标
  24.                 for (int x = 0; x < arr.length; x++) {
  25.                         if (first.equals("max")) {
  26.                                 if (arr[x] > arr[index]) { // 最大值
  27.                                         index = x;
  28.                                 }
  29.                         } else if (first.equals("min")) {
  30.                                 if (arr[x] < arr[index]) { // 最小值
  31.                                         index = x;
  32.                                 }
  33.                         } else {
  34.                                 System.out
  35.                                                 .println("请输入正确的参数,first : 接收指令: max 返回最大值,min:返回最小值");
  36.                         }
  37.                 }
  38.                 return arr[index];
  39.         }

  40.         /**
  41.          * 选择排序法; first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)
  42.          * */
  43.         public static void selectSort(int[] arr, String first) {
  44.                 for (int i = 0; i < arr.length; i++) {
  45.                         for (int j = i + 1; j < arr.length; j++) {
  46.                                 if ("maxToMin".equals(first)) {// 降序
  47.                                         if (arr[i] < arr[j]) {
  48.                                                 swap(arr, i, j);
  49.                                         }
  50.                                 } else if ("minToMax".equals(first)) {// 升序
  51.                                         if (arr[i] > arr[j]) {
  52.                                                 swap(arr, i, j);
  53.                                         }
  54.                                 } else {
  55.                                         System.out
  56.                                                         .println("请输入正确的参数:first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)");
  57.                                         return;
  58.                                 }
  59.                         }
  60.                 }
  61.         }

  62.         /**
  63.          * 冒泡排序法; first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)
  64.          * */
  65.         public static void bubUpSort(int[] arr, String first) {
  66.                 for (int i = 0; i < arr.length; i++) {
  67.                         for (int j = 0; j < arr.length - 1; j++) {
  68.                                 if ("maxToMin".equals(first)) { // 降序
  69.                                         if (arr[j] < arr[j + 1]) {
  70.                                                 swap(arr, i, j + 1);
  71.                                         }
  72.                                 } else if ("minToMax".equals(first)) { // 升序
  73.                                         if (arr[j] > arr[j + 1]) {
  74.                                                 swap(arr, j, j + 1);
  75.                                         }
  76.                                 } else {
  77.                                         System.out
  78.                                                         .println("请输入正确的参数:first : 接收指令: maxToMin 降序(从大到小);minToMax:升序(从小到大)");
  79.                                 }
  80.                         }
  81.                 }
  82.         }

  83.         /**
  84.          * 数组位置交换
  85.          * */
  86.         // 这里定义成private修饰,是因为,该函数,只是本类中使用的,不能让外部使用。
  87.         private static void swap(int[] arr, int i, int j) {
  88.                 int temp;
  89.                 temp = arr[i];
  90.                 arr[i] = arr[j];
  91.                 arr[j] = temp;
  92.         }

  93.         /**
  94.          * 折半查找法,二分查找法,返回该key在数组中的位置, 未找到则返回 负数,并且返回的结果 的绝对值 -1 则是该数应该存在的位置。
  95.          * 二分查找法,必须是有序的
  96.          * */
  97.         public static int binaryChop(int[] arr, int key) {
  98.                 int min = 0; // 最小角标
  99.                 int max = arr.length - 1; // 最大角标
  100.                 int index = (min + max) / 2; // 折半后的index 指针
  101.                 while (max > min) { // 条件不成立的话则表示,未找到
  102.                         if (key == arr[index]) {
  103.                                 return index;
  104.                         }
  105.                         if (key > arr[index]) {
  106.                                 min = index + 1; // 这里无限为真 ,结合下面的注释语句
  107.                         } else if (key < arr[index]) {
  108.                                 max = index - 1; // 这里就执行不到了。
  109.                         } else {
  110.                                 return index;
  111.                         }
  112.                         index = (min + max) / 2; // 一定要记住这句,不然上面的条件
  113.                 }
  114.                 return -min - 1;
  115.         }

  116.         /**
  117.          * 打印数组中的元素
  118.          * */
  119.         public static void print(int[] arr) {
  120.                 System.out.print("[");
  121.                 for (int i = 0; i < arr.length; i++) {
  122.                         if (i == arr.length - 1) { // 处理最后一个角标的显示风格
  123.                                 System.out.print(arr[i] + "]");
  124.                         } else {
  125.                                 System.out.print(arr[i] + ",");
  126.                         }
  127.                 }
  128.                 System.out.println();
  129.         }
  130. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
范二青年 发表于 2014-1-13 17:06
哥们 你在方法中把arr数组的值给改变了啊
每次判断之后会把arr的值变为当前最小的,index一直是0所以就会一 ...

谢谢。  还真是这里的问题。  :)
回复 使用道具 举报
范二青年 发表于 2014-1-13 17:06
哥们 你在方法中把arr数组的值给改变了啊
每次判断之后会把arr的值变为当前最小的,index一直是0所以就会一 ...

对了, 你这个发表帖子的代码  怎么会有缩进啊?  要怎么操作? 我发布的帖子,代码都没有缩进
回复 使用道具 举报
app297 发表于 2014-1-13 17:34
对了, 你这个发表帖子的代码  怎么会有缩进啊?  要怎么操作? 我发布的帖子,代码都没有缩进 ...

直接在eclipse里面写代码啊,就有格式,没有格式的也可以使用ctrl+shift+f格式化一下再发。
回复 使用道具 举报
范二青年 发表于 2014-1-13 17:54
直接在eclipse里面写代码啊,就有格式,没有格式的也可以使用ctrl+shift+f格式化一下再发。 ...

我就是在里面复制出来的。 但是发到帖子上就没有缩进了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马