【Java进阶学习 第九篇】常用API(Array、冒泡选择排序、二分查找、正则表 ...

打印 上一主题 下一主题

主题 994|帖子 994|积分 2982

Array类常用方法

   public static string tostring(类型[]a):将数组元素拼接为带有格式的字符串
  
public static boolean equals(类型[]a,类型[]b):比力两个数组内容是否雷同
  
  public static int binarySearch(int[] a,int key):査找元素在数组中的索引(二分査找法:保证数组的元素是排好序的
  
  public static void sort(类型[]a):对数组举行默认升序排序
  1.     public static void main(String[] args) {
  2.         int[] arr1={11,22,33,44,55};
  3.         int[] arr2={11,22,33,44,55};
  4.         System.out.println(Arrays.toString(arr1));
  5.         //[11, 22, 33, 44, 55]
  6.         System.out.println(Arrays.equals(arr1, arr2));
  7.         //true
  8.         System.out.println(Arrays.binarySearch(arr1, 33));
  9.         //2
  10.         int[] arr3={33,11,22,55,44};
  11.         System.out.println(Arrays.binarySearch(arr3, 44));
  12.         //-4
  13.         Arrays.sort(arr3);
  14.         System.out.println(Arrays.toString(arr3));
  15.         //[11, 22, 33, 44, 55]
  16.     }
复制代码
留意,Array中的binarySearch方法只能针对已经排序好的数组,由于用的是二分查找法。

冒泡排序

相邻的两个元素举行比力,如果第一个元素比第二个元素大,就交换他们
  1.     public static void main(String[] args) {
  2.         int[] arr1={44,22,55,66,11,33};
  3.         //外循环确定循环的次数
  4.         for(int i=0; i<arr1.length-1; i++){
  5.             //内循环确定每次循环比较的次数
  6.             //arr.length-1防止数组索引越界
  7.             //arr.length-1-i提高效率
  8.             for(int j=0; j<arr1.length-i-1; j++){
  9.                 if(arr1[j]>arr1[j+1]){
  10.                     int temp=arr1[j];
  11.                     arr1[j]=arr1[j+1];
  12.                     arr1[j+1]=temp;
  13.                 }
  14.             }
  15.         }
  16.         System.out.println(Arrays.toString(arr1));
  17.         //[11, 22, 33, 44, 55, 66]
  18.     }
复制代码


  • 由于每次循环结束,我们就确定了一个最大的数字,所以我们只需要循环arr.length-1次;
  • 为了每次循环的时候数组索引会出现越界征象,我们将内循环的arr.length-1;
  • 由于下一轮循环会比本次循环少比力一次,为了进步服从我们将内循环的条件定为arr.length-1-i;

选择排序

从0索引开始,拿着每一个索引上的元素跟后面的元素依次比力
  1.     public static void main(String[] args) {
  2.         int[] arr1={44,22,55,66,11,33};
  3.         //外循环确定循环轮数
  4.         for(int i=0;i<arr1.length-1;i++){
  5.             //内循环确定循环次数
  6.             for(int j=i+1;j<arr1.length;j++){
  7.                 //j=1,2,3,4,5
  8.                 if(arr1[i]>arr1[j]){
  9.                     int temp=arr1[i];
  10.                     arr1[i]=arr1[j];
  11.                     arr1[j]=temp;
  12.                 }
  13.             }
  14.         }
  15.         System.out.println(Arrays.toString(arr1));
  16.         //[11, 22, 33, 44, 55, 66]
  17.     }
复制代码


  • 每次循环我们都会拿目前没确定顺序的第一个元素和后面所有元素逐一对比,选出最小的和第一个元素交换顺序,所以每次循环会确定一个最小的数字,我们只需要循环arr.length-1次;
  • 每次循环未确定顺序第一个元素可以用arr举行表示;
  • 最后一次循环i是4,j是5,只需要比力一次,所以j=i+1;

二分查找

条件:数组中的数据必须是排序好的
定义数组第一个元素和min和最后一个元素max,找到中间元素mid,通过比力目的数据和中间元素的巨细,选择移动min照旧max。
   

  • 目的元素大于中间元素:min=mid+1
  • 目的元素小于中间元素:max=mid-1
  • 如果正常二分查找到了目的数据那么:min<=max
  1.     public static void main(String[] args) {
  2.         int[] arr = {1,2,3,4,5,6,7,8,9,10};
  3.         Scanner sc = new Scanner(System.in);
  4.         System.out.println("请输入您想查找的数据:");
  5.         int target=sc.nextInt();
  6.         midSearch(arr,target);
  7.     }
  8.     private static void midSearch(int[] arr,int target) {
  9.         int min=0;
  10.         int max= arr.length-1;
  11.         int mid;
  12.         while(min<=max)
  13.         {
  14.             mid=(max+min)/2;
  15.             if (target==arr[mid])
  16.             {
  17.                 System.out.println("你想找的数字在数组中的索引为"+mid);
  18.                 return;
  19.             } else if (target>arr[mid]) {
  20.                 min=mid+1;
  21.             } else if (target<arr[mid]) {
  22.                 max=mid-1;
  23.             }
  24.         }
  25.         System.out.println("数组中没有你想找的数据");
  26.     }
复制代码

正则表达式

本质来说就是一个字符串可以制定一些规则来校验其他字符串
[]表示单个字符,如"abc"和"[abc]":"abc"代表只能内容为abc的字符串能通过校验,而"[abc]"代表a,b,c三个单个字符都可以通过校验
字符类

   [abc],[^abc]:除了abc之外的其他字符
  1.         String regex1="abc";
  2.         String regex2="[abc]";
  3.         String regex3="[^abc]";
  4.         System.out.println("a".matches(regex1));
  5.         System.out.println("a".matches(regex2));
  6.         System.out.println("0".matches(regex3));
  7. //        false
  8. //        true
  9. //        true
复制代码
  [a-zA-Z0-9]范围联合:
  1.         String regex4="[a-zA-Z0-9]";
  2.         System.out.println("a".matches(regex4));
  3.         System.out.println("B".matches(regex4));
  4.         System.out.println("9".matches(regex4));
  5. //        true
  6. //        true
  7. //        true
复制代码
[a-z&&[^bc]]:a到c中除了b和c以外的其他字符

预定义字符类

   

  • .代表恣意字符
  • \d代表一个数字
  • \D代表非数字
  • \w代表英文数字和下划线
  1.         String regex5="\\d";
  2.         String regex6="\\D";
  3.         String regex7="..";
  4.         String regex8="\\w";
  5.         System.out.println("1".matches(regex5));
  6.         System.out.println("B".matches(regex6));
  7.         System.out.println("11".matches(regex7));
  8.         System.out.println("_".matches(regex8));
  9. //        true
  10. //        true
  11. //        true
  12. //        true
复制代码

数量

   

  • ?一次或0次 
  • *    恣意次数
  • +一次或多次
  • {n}恰好n次
  • {n, }至少n次
  • {n,m}至少n次但不超过m次
  
应用场景

QQ号正则

不能以0开头,全都是数字,5~12位
  1.         String qqregex ="[1-9]\\d{4,11}";
  2.         System.out.println("123456".matches(qqregex));
  3.         System.out.println("12a456".matches(qqregex));
  4.         System.out.println("023456".matches(qqregex));
  5.         System.out.println("123456452354324".matches(qqregex));
  6. //        true
  7. //        false
  8. //        false
  9. //        false
复制代码
其中[1-9]我们定义了第一个字符,后面只需要定义其他字符就可以,4到11位都是数字 

手机号正则

必须是1开头,第二位是3-9,全都是数字,必须是11位
  1.         String phoneregex ="[1][3-9]\\d{9}";
  2.         System.out.println("13888888888".matches(phoneregex));
  3.         System.out.println("138888888".matches(phoneregex));
  4.         System.out.println("23888888888".matches(phoneregex));
  5.         System.out.println("11888888888".matches(phoneregex));
  6.         System.out.println("1388fd88a888".matches(phoneregex));
  7. //        true
  8. //        false
  9. //        false
  10. //        false
  11. //        false
复制代码
邮箱正则

  1.         String emailregex ="\\w+[@][\\w&&[^_]]+(\\.[a-z]{2,3})+";
  2.         System.out.println("2312313@qq.com".matches(emailregex));
  3.         System.out.println("12_aa@126.cn.com".matches(emailregex));
  4.         System.out.println("12_aa@1_6.cn.com".matches(emailregex));
  5.         System.out.println("12_aa@126.cncs.com".matches(emailregex));
  6. //        true
  7. //        true
  8. //        false
  9. //        false
复制代码
替换方法

   public string replaceAll(string regex,string newstr): 按照正则表达式匹配的内容举行替换
   我们可以将正则表达式regex封装为Pattern对象,通过pattern中的matcher方法,将我们要举行查验的字符串封装为匹配器Matcher对象,终极通过while语句,find一个字符再用group爬取一个字符
  1.         String data ="来黑马程序员学习Java,"+
  2.         "电话:18666668888,18699997777或者联系"+
  3.                 "邮箱:boniu@itcast.cn 邮箱:bozai@itcast.cn 邮箱2:dlei0009@163.com"
  4.                 +"座机电话:01036517895,010-98951256"
  5.                 +"热线电话:400-618-9090,400-618-400,400618400,4006189090";
  6.         String regex="[1][3-9]\\d{9}|\\w+[@][\\w&&[^_]]+(\\.[a-z]{2,3})+|[0]\\d{2,3}[-]?\\d{7,8}|400-?\\d{3}-?\\d{3,4}";
  7.         //将正则表达式封装为Pattern对象
  8.         Pattern pattern = Pattern.compile(regex);
  9.         //获取匹配器对象
  10.         Matcher matcher = pattern.matcher(data);
  11.         //通过匹配器从内容中爬取信息
  12.         while (matcher.find()) {
  13.             System.out.println(matcher.group());
  14.         }
  15. //        18666668888
  16. //        18699997777
  17. //        boniu@itcast.cn
  18. //        bozai@itcast.cn
  19. //        dlei0009@163.com
  20. //        01036517895
  21. //        010-98951256
  22. //        400-618-9090
  23. //        400-618-400
  24. //        400618400
  25. //        4006189090
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表