(數(shù)據(jù)結(jié)構(gòu)代碼,總結(jié),自我思考)=> { return 個(gè)人學(xué)習(xí)筆記; } 【To be continued~】
俗話說(shuō) “學(xué)而不思則罔”,是時(shí)候復(fù)習(xí)和整理一下自己先前的學(xué)習(xí)歷程了!
Chapter-One
《BinarySearch》
public static int binarySearch (int[] a, int target) {
int i = 0, j = a.length - 1;
while (i <= j) {
int m = (i + j) >>> 1; // 求中位數(shù),但是是用位運(yùn)算符的方式,相對(duì)于除法,這種方式更加高效
if (target < a[m]) {
j = m - 1; // 如果找到的目標(biāo)數(shù)小于中位數(shù),則在中位數(shù)的左邊開始找起
} else if (a[m] < target){
i = m + 1; // 如果找到的目標(biāo)數(shù)大于中位數(shù),則在中位數(shù)的右邊開始找起
} else {
return m; // 找到則直接返回改數(shù)值在數(shù)組中的索引的值
}
}
return -1; /* 沒有找到則直接返回-1,當(dāng)然這里選擇拋出異常(并提示異常信息,個(gè)人覺得對(duì)用戶體驗(yàn)更加好 如: ) throw new RuntimeException("目標(biāo)數(shù)值不在數(shù)組中"); */
}
自問自答
問:為什么while的條件中 i <= j 而不是 [instead of] i < j ?
答:1. 首先,顧名思義,前面的條件會(huì)比后面的條件多執(zhí)行一次。
2. 那如果當(dāng) target == i == j 的時(shí)候呢,那少去的這一次就會(huì)因?yàn)椴粷M足while條件直接退出循環(huán)了,然后放回直接沒有找到的該目標(biāo)值。因此為了避免這種情況的發(fā)生,我們應(yīng)該加上等于號(hào)。
《DynamicArray》
import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;
public class DynamicArray implements Iterable<Integer> {
private int size = 0; // 數(shù)組中存儲(chǔ)元素的個(gè)數(shù)
private int capacity = 8; // 數(shù)組的容量大小
private int[] array = {};
public void addLast(int element) { // 在數(shù)組的尾部添加元素
// array[size] = element;
// size++; the original thought
add(size,element);
}
public void add(int index, int element) {
checkAndGrow(); // 判斷需要?jiǎng)討B(tài)擴(kuò)容的模式
if (index >=0 && index < size) {
System.arraycopy(array, index,
array, index + 1, size - index); // 使用java自帶的內(nèi)置API,進(jìn)行數(shù)組的復(fù)制
} else if (index < 0) {
throw new RuntimeException("index typing wrong, retry again please!");
}
array[index] = element;// 指定的位置對(duì)元素進(jìn)行添加
size++; // 更新數(shù)組元素個(gè)數(shù)
}
private void checkAndGrow() {
//check
if (size == 0) {
array = new int[capacity];// 等于0時(shí),默認(rèn)初始化的容量
} else if (size == capacity) {
capacity += capacity >> 1; // 擴(kuò)容1.5倍
int[] newArray = new int[capacity];
System.arraycopy(array, 0,
newArray, 0, size); // 數(shù)組復(fù)制
array = newArray;
}
}
public int get(int index) { // 獲取數(shù)組中指定的元素
return array[index];
}
public void foreach(Consumer<Integer> consumer) { //遍歷數(shù)組元素
for (int i = 0; i < size; i++) {
consumer.accept(array[i]);
}
}
@Override
public Iterator<Integer> iterator() { // 迭代器
return new Iterator<Integer>() {
int i = 0;
@Override
public boolean hasNext() { // 判斷是否有下一個(gè)元素
return i < size;
}
@Override
public Integer next() { // 返回當(dāng)前元素,并且指針向后面移動(dòng)一位
return array[i++];
}
};
}
public IntStream stream() { // 將數(shù)組轉(zhuǎn)成int字節(jié)流
return IntStream.of(Arrays.copyOfRange(array,0,size)); //[0,size)
}
public int remove(int index) { //移除指定的 范圍:[0,size)
int removed = array[index];
if (index < size - 1) {
System.arraycopy(array, index + 1,
array, index, size - index - 1);
}
size--;
return removed;
}
}
自問自答
問:箭頭函數(shù)在這里的用法?
答 1. foreach方法中定義的參數(shù),類似一個(gè)集合的作用,把數(shù)組中所有的遍歷之后的元素都存起來(lái)了
2. 因此在調(diào)用的階段,我們直接傳一個(gè)(whatever)形參,然后在 {代碼塊中},我們可以對(duì)該參數(shù)做任何我們想做的事情或者實(shí)現(xiàn)想要實(shí)現(xiàn)的功能。
3. 相當(dāng)于是,內(nèi)部收集到了這個(gè)數(shù)組的值,但是這個(gè)值有什么用途,留給調(diào)用這個(gè)方法的用戶去決定了。

example
@Test
public void test2() {
DynamicArray dynamicArray = new DynamicArray();
AtomicInteger sum = new AtomicInteger(); // 把變量設(shè)置為原子狀態(tài)的Integer包裝類型
dynamicArray.addLast(1);
dynamicArray.addLast(2);
dynamicArray.addLast(3);
dynamicArray.addLast(4);
dynamicArray.forEach((element)->{
sum.addAndGet(element);// 對(duì)element的所有元素進(jìn)行相加, 這里返回值是int,但是我選擇不接收。
});
System.out.println(sum.get()); //輸出累加的結(jié)果!
}
