程序员成长之路(Day 10)

目录

学习目标:

学习内容:

数组的遍历访问:

        简单循环:

        增强for循环:

数组元素的顺序查找:

        顺序查找:

         二分查找:

数组元素的冒泡法排序:

        冒泡排序法:

Arrays工具类的使用

        数组转换字符串

        升序排列

        所有元素赋特定值

        判断数组是否相等

        对数组复制

        查询数组下标

        数组转换成集合

二维数组:

        声明:

        初始化二维数组

         获取二维数组中的元素

         遍历二维数组

延伸:

SringBuffer:   

定义:

StringBuffer和String的区别?

StringBuffer()的方法:

        构造方法:

        返回长度:

        添加功能:

        删除功能:

        截取功能:

        替换功能:

        反转功能:

LintCode刷题:

·获取索引为1的元素

 ·删除字符串中指定位置的内容

 ·统计字符串中包含多少数字

·获取字符串长度 

 ·求三个数的最大值

·统计字符串中不同字符的个数 

· 替换字符串中的内容

学习产出:


学习目标:

  • 数组的遍历访问(普通循环,增强for循环)
  • 数组元素的顺序查找
  • 数组元素的冒泡法排序
  • Arrays工具类的使用
  • 二维数组

学习内容:

数组的遍历访问:

        简单循环:

首先我们要知道数组元素下标的合法区间:[0, length-1](即从0开始到数组长度减一)。我们可以通过下标来遍历数组中的元素,遍历时可以读取或修改元素的值。

public class Test {
 
  public static void main(String[] args) {
    int[] a = new int[4];
    for (int i = 0; i < a.length; i++) {
      a[i] =  i;
    }
    for (int i = 0; i < a.length; i++) {
      System.out.println(a[i]);
    }
  }
}

        增强for循环:

专门用于读取数组或集合中所有的元素,即对数组进行遍历。

public class Test {
  
  public static void main(String[] args) {
    int[] a = new int[4];
    for (int i = 0; i < a.length; i++) {
      a[i] =  i;
    }
    for(int j: a){
        System.out.println(j)
    }
  }
}

数组元素的顺序查找:

        顺序查找:

也就是按顺序一位一位的查找,找到要查找数的索引(下标)。

 public static int findIndex(int[] arr, int num) {
    for (int i = 0; i < arr.length; i++) {
      if (arr[i] == num) {
        return i;
      }
    }
    return -1;
  }
  • 优点:实现简单,容易理解;
  • 弊端:数据量大的时候,计算机的负载也非常的大,效率低。

         二分查找:

折半查找,每次搜索过滤掉一半的元素,直到找到该元素为止

private static int find(int[] arr, int num) {
    int start = 0;
    int end = arr.length - 1;
    if (num < arr[start] || num > arr[end]) {
      return -1;
    }
    int mid;
    while (start <= end) {
      mid = (start + end) / 2;
      if (arr[mid] > num) {
        end = mid - 1;
      } else if (arr[mid] < num) {
        start = mid + 1;
      } else {
        return mid;
      }
    }
    return -1;
 }
  • 优点:优化了查找的效率。
  • 弊端:查找数组必须经过排序(即有序)

数组元素的冒泡法排序:

        冒泡排序法:

public static void test4() {
		int[] a= {23,25,68,15};
		for(int i=0;i<a.length-1;i++) {
			for (int j = 0; j < a.length-i-1; j++) {
				if(a[j]>a[j+1]) {
					int temp=a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
				}
			}
			System.out.println(Arrays.toString(a));
		}
	}

         正常情况下可以使用Array.sort(int []),来实现排序

Arrays工具类的使用

        数组转换字符串

String str=Arrays.toString(int[] arr);

        升序排列

Arrays.sort(int[] arr);

        所有元素赋特定值

Arrays.fill(int[] arr,10);

        判断数组是否相等

boolean boo=Arrays.equals(int[] arr,int[] arr2);

        对数组复制

int d[]=Arrays.copyOf(int[] arr,arr.length);

Arrays.copyOfRange(arr,[] 起始索引位置, 终止索引位置)

        查询数组下标

int i=Arrays.binarySearch(int[] arr, int key);

        数组转换成集合

String str = Arrays.toString(int[] arr);

List<String> list = Arrays.asList(str);

二维数组:

        在Java中二维数组被看作为数组的数组,即二维数组为一个特殊的一维数组,其每个元素又是一个一维数组。Java并不直接支持二维数组,但是允许定义数组元素是一维数组的一维数组,以达到同样的效果。

        声明:

        type arrayName[][];整个二维数组可表示一个矩阵,第一个中括号表示行,第二个中括号表示列。

        初始化二维数组

        二维数组可以初始化,和一维数组一样,可以通过三种方式来指定元素的初值

type[][] arrayName = new type[][]{值 1,值 2,值 3,…,值 n};    // 在定义时初始化
type[][] arrayName = new type[size1][size2];    // 给定空间,在赋值
type[][] arrayName = new type[size][];    // 数组第二维长度为空,可变化

         获取二维数组中的元素

        当需要获取二维数组中元素的值时,可以使用下标来获取。

int[][] arr = {{10,9,9},{10,9,7},{10,10,5},{9,6,5}};
System.out.println("第二行第二列元素的值:"+arr[1][1]);

         遍历二维数组

        在二维数组中,直接使用 length 属性获取的是数组的行数,在指定的索引后加上 length(如 array[0].length)表示的是该行拥有多少个元素,即列数。使用两层for循环即可

public static void main(String[] args) {
    int[][] arr = {{10,9,9},{10,9,7},{10,10,5},{9,6,5}};
    for (int i = 0; i < arr.length; i++) { // 遍历行
        for (int j = 0; j < arr[i].length; j++) {
            System.out.println("arr[" + i + "][" + j + "]=" + arr[i][j]);
        }
    }
}

         for each 循环语句不能自动处理二维数组的每一个元素。它是按照行, 也就是一维数组处理的。要想访问二维教组 a 的所有元素, 需要使用两个嵌套的循环

public static void main(String[] args) {
   int[][] arr = {{10,9,9},{10,9,7},{10,10,5},{9,6,5}};
    for (int[] row : arr) {
        for (int value : row) {
            System.out.println(value);
        }
    }
}

延伸:

SringBuffer:   

定义:

线程安全的可变字符串。

StringBuffer和String的区别?

前者长度和内容可变,后者不可变

我们如果对字符串进行拼接操作,每次拼接都会构成一个新的String对象,既耗时,又浪费空间StringBuffer可以解决这个问题。

StringBuffer()的方法:

        构造方法:

                public StringBuffer():无参构造方法

                public StringBuffer(int capacity):指定容量的字符串缓冲区对象

                public StringBuffer(String str)指定字符串内容的字符串缓冲区对象

        返回长度:

                public int Capacity();返回当前容量 理论值

                public int length() 返回长度(字符数) 实际值

        添加功能:

                public StringBuffer append(String str)
        可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
                 public StringBuffer insert(int offset,String str)
         在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身

        删除功能:

                public StringBuffer deleteCharAt(int index)

        删除指定位置字符,并返回本身

                public StringBuffer delete(int start,int end)

        删除从指定位置开始,并从指定位置结束字符,并返回本身

        截取功能:

                public String substring(int start)

                public String substring(int start,int end)

        替换功能:

                public StringBuffer replace(int start,int end,String str)

        从start到end用str替换

        反转功能:

                public StringBuffer reverse()

        ”hello“->"olleh"

LintCode刷题:

·获取索引为1的元素

         用string.charAt(int)即可

public class Solution {
    public char getIndexOne(String str) {
        return str.charAt(1); 
    }
}

 ·删除字符串中指定位置的内容

         延伸->(StringBuffer

        运用delete方法即可

public class Solution {
    public StringBuffer deleteString(String str, int indexStart,
                                     int indexEnding) {
        StringBuffer stringBuffer=new StringBuffer(str);
        stringBuffer.delete(indexStart,indexEnding);
        return stringBuffer;
    }
}

 ·统计字符串中包含多少数字

         把string转换成为字符数组,for循环遍历中可以根据:

               1、c>48&&c<57(c>'0'&&c<'9')

                2、Character.isDigit(c)

public class Solution {

    public int statistics(String str) {
        int count=0;
        char[] chars=str.toCharArray();
        //Character.isDigit(c)
        for (char c:chars){
            if (c>=48&&c<=57){
                count++;
            }
        }
        return count;
    }
}

·获取字符串长度 

         直接返回字符串长度即可 

public class Solution {
    public int getStringLength(String str) { 
        return str.length();
    }
}

 ·求三个数的最大值

         先比较两个,再由两个之间较大的去和第三个比较

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int a =scanner.nextInt();
        int b =scanner.nextInt();
        int c =scanner.nextInt();
        int max=Math.max(a,b);
        int resultmax=Math.max(max,c);
        System.out.println(resultmax);
    }
}

·统计字符串中不同字符的个数 

        在for循环中加入ifelse判断 最后输出数组即可

public class Solution {
    public int[] statistics(String str) {
        int capitalLetters=0,lowercaseLetters=0,digital=0,otherCharacters=0;
        char[]chars=str.toCharArray();
        for (char c:chars){
            if (Character.isLowerCase(c))
                lowercaseLetters++;
            else if (Character.isUpperCase(c))
                capitalLetters++;
            else if (Character.isDigit(c))
                digital++;
            else otherCharacters++;
        }
        int[] arr=new int[4];
        arr[0]=capitalLetters;
        arr[1]=lowercaseLetters;
        arr[2]=digital;
        arr[3]=otherCharacters;
        return arr;
    }
}

· 替换字符串中的内容

         replace或delete再insert都可以实现

public class Solution {
    public StringBuffer updateString(String str1, String str2) {
        StringBuffer stringBuffer=new StringBuffer(str1);
//        stringBuffer.delete(4,7);
//        stringBuffer.insert(4,str2);
        stringBuffer.replace(4,7,str2);
        return stringBuffer;
    }
}


学习时间:

2021-8-18 9:00-11:45、13:30-17:30


学习产出:

学习博客*1

刷题*7

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值