目录
学习目标:
- 数组的遍历访问(普通循环,增强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