Java基础复习第四天

关键词:数组的综合应用

1.将数组转成字符串

         定义功能,将{23,27,998}数组中的元素转成字符串”[23,27,998]”

         public static void toString(int[] arr){

      String temp = "[";

      for(int i=0;i<arr.length;i++){

        if(i<arr.length-1){

           temp = temp + arr[i] + ",";

        }

        if(i==arr.length-1){

           temp = temp + arr[i] + "]";

        }

      }

      System.out.println(temp);

   }

2.总结:数组使用的核心思想

-容器特点:a.固定长度   b.元素都有索引

         -什么时候使用容器呢?数据多了,必须先进行存储。然后进行操作。

         -对于数组容器什么时候用呢?数据多,个数确定,而且有对应关系。

         -在分析需求时,

                   1,需求中的数据是否有对应的有序编号?

                   2,需求中的数据是否需要有序的编号?

            如果有,就用数组存储。

-查表法:数据之间存在对应关系。通过关系中一方查询另一方。当对应关系存在,但没有一方是有序编号时,使用另一个容器 map。

3. 进制之间的转换

a.需求:十进制-->十六进制。

public static void main(String[] args) {

      int[] arr = {12,23,14,15,16,17};

      toString(arr);

     

      System.out.println("--------------分割线---------------");

     

      int num = 60;

      String str = toHex(num);

      System.out.println(str);

     

      System.out.println("--------------分割线---------------");

     

      int num2 = 60;

      String str2 = toHex_2(num2);

      System.out.println(str2);

   }

  

   //1.定义功能,将{23,27,998}数组中的元素转成字符串”[23,27,998]”

   public static void toString(int[] arr){

      String temp = "[";

      for(int i=0;i<arr.length;i++){

        if(i<arr.length-1){

           temp = temp + arr[i] + ",";

        }

        if(i==arr.length-1){

           temp = temp + arr[i] + "]";

        }

      }

      System.out.println(temp);

   }

  

   //2.需求:十进制-->十六进制。&15  >>>4  循环 

   //eg,   60 -->  3C

   public static String toHex(int num){

      //2.1.定义容器,存储的是字符,长度为8,一个整数最多为8个16进制位。

      char[] chs = new char[8];

      //2.2.定义一个用于操作数组的索引。

      int index = chs.length;

      //2.3.循环存数组。

      while(num!=0){

        int temp = num & 15;

        if(temp > 9){

           chs[--index] = (char)(temp-10+‘A‘);

        }else{

           chs[--index] = (char)(temp + ‘0‘);

        }

        num = num >>> 4;

      }

      return "0X"+toString(chs);

   }

   //2.4.定义一个功能,将字符数组转成字符串

   private static String toString(char[] arr) {

      String temp = "";

      for(int i=0;i<arr.length;i++){

        temp = temp + arr[i];

      }

      return temp;

   }

  

   //第二题的改进版:

   /*

    思路:

      十进制转成十六进制的每一位都是十六进制元素中的某一个,

      十六进制的元素是固定个数的,而且还有对应的编号。

      所以,可以使用传说中的   查表法。

    */

   public static String toHex_2(int num){

      //1.建立表

      char[] chs = {‘0‘,‘1‘,‘2‘,‘3‘

                ,‘4‘,‘5‘,‘6‘,‘7‘

                ,‘8‘,‘9‘,‘A‘,‘B‘

                ,‘C‘,‘D‘,‘E‘,‘F‘};

     

      //2.创建临时容器

      char[] arr = new char[8];

     

      //3.创建操作临时容器的角标

      int index = arr.length;

     

      //4.通过循环对num进行&和>>>操作

      while(num!=0){

        //5.对num进行&运算

        int temp = num & 15;

        //6.根据&运算后的结果作为角标查表,获取对应的字符。并将字符存储到临时容器中。

        arr[--index] = chs[temp];

        //7.对num进行右移

        num = num >>> 4;

       

      }

      return "0X"+toString(arr,index);

   }

 

   private static String toString(char[] arr, int index) {

      String temp = "";

      for (int i = index; i < arr.length; i++) {

        temp = temp + arr[i];

      }

      return temp;

   }

  

b.总结版:进制之间的转换

需求:十进制-->十六进制,终结版。

             思路:

                十进制转成十六进制的每一位都是十六进制元素中的某一个。

                十六进制的元素有很多固定个数。而且还有对应的编号。

                所以可以使用传说中的 查表法!

4. 进制总结大集合。十进制向2进制、8进制、16进制等的转换。

public static void main(String[] args) {

     

      //10--->2

      int num = 76;

      String str1 = trans(num, 1, 1);

      System.out.println("10--->2进制:   "+str1);

      System.out.println("-------------分割线----------------");

     

      //10--->8

      String str2 = trans(num, 7, 3);

      System.out.println("10--->8进制:   "+str2);

      System.out.println("-------------分割线----------------");

     

      //10--->16

      String str3 = trans(num, 15, 4);

      System.out.println("10--->16进制:   "+str3);

      System.out.println("-------------分割线----------------");

 

   }

  

   //十进制与二进制、八进制、十六进制之间的转换。--终极版

   public static String trans(int num,int base,int offset){

      //1.建表,通用表,任何进制都是通用的。

      char[] chs = {‘0‘,‘1‘,‘2‘,‘3‘

              ,‘4‘,‘5‘,‘6‘,‘7‘

              ,‘8‘,‘9‘,‘A‘,‘B‘

              ,‘C‘,‘D‘,‘E‘,‘F‘};

      //2.建立临时容器,用来存放获取对应的进制数。

      char[] arr = new char[32];//这边是因为,如果是二进制的话,就有可能是32位了,

                        //这个大一点没事,反正是从后面开始存的,转成字符串的话也是从非0的位置来进行的。

      //3.反过来存放进制数的角标

      int index = arr.length;

      //4.获取进制数,进行转换

      while(num!=0){

        int temp = num & base;

        arr[--index] = chs[temp];

        num = num >>> offset;

      }

      //5.转为字符串

      return toString(arr,index);

   }

 

   private static String toString(char[] arr, int index) {

      String temp = "";

      for (int i = index; i < arr.length; i++) {

        temp = temp + arr[i];

      }

      return temp;

   }

  

5. 数组的反转。有序数组的插入点

a.在数组中查找一个数时,如果没有找到这个数,通常会返回-1,这里的-1,代表的是角标不存在的情况。

b. 需求:如果往有序的数组中插入一个元素并继续保证有序,问如何获取该位置?

分析:既然是有序的数组,而且是找位置,必须要想到 二分查找法。

解答:

public static void main(String[] args) {

      int[] arr = {9,13,22,51,54,78,110};

      int index = searchIndex(arr, 34);

      System.out.println("The index=  "+index);

      //这里因为数组的长度是不能变化的,所以只能获取到插入点,而不能将这个数插入到这个数组中。

 

   }

  

   //如果往有序的数组中插入一个元素并继续保证有序,问如何获取该位置?

   public static int searchIndex(int[] arr,int key){

        int max,min,mid;

        min = 0;

        max = arr.length-1;

 

        while(min<=max)

        {

           mid = (min+max)>>1;

 

           if(key>arr[mid])

              min = mid + 1;

           else if(key<arr[mid])

              max = mid - 1;

           else

              return mid;

        }

        return min;

      }

}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。