目錄
由於List(線性表)是一個接口,所以一般用ArrayList(順序表)和LinkedList(鏈表)進行構造。
//設置初始容量,若不設置,默認初始容量爲10,1.5倍擴容
List<Integer> list = new ArrayList<>(10);
List<Integer> List2 = new LinkedList<>();
List的常見方法:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1); //尾插
list.add(1,3); //把3插入index=1的位置
list.addAll(list); //傳入的參數必須實現Collection接口
list.remove(0); //刪除index位置元素
int ret = list.get(1); //獲得index位置的元素
list.set(0,11); //將0號下標的元素設爲11
boolean bol = list.contains(11); //判斷11是否在線性表中
int ret1 = list.indexOf(11); //返回第一個11所在的位置
int re2 = list.lastIndexOf(11); //返回最後一個11所在的位置
List l1 = list.subList(0,1); //截取部分list 沒有產生新的對象!
}
List的實現
ArrayList:底層由數組實現,查詢快,增刪慢。線程不安全,效率高。
Vector:底層由數組實現,查詢快,增刪慢。線程安全,效率底。
LinkedList:底層由鏈表實現,查詢慢,增刪快。線程不安全,效率高。
List的使用
1.有一個List當中存放的是整形的數據,要求使用Collection.sort對List進行排序。
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(12);
list.add(4);
list.add(7);
list.add(6);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
如果是自定義類型:
1)Person實現comparable接口
2)重寫comparaTo()方法
class Person implements Comparable<Person> {
public String name;
public int age;
public Person(String name, int age) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Person o) {
return this.age - o.age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public static void main1(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(12);
list.add(4);
list.add(7);
list.add(6);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("a", 22));
list.add(new Person("c",10));
list.add(new Person("b",55));
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
2.刪除第一個字符串當中出現的第二個字符串中的字符。
例如:
String str1 = "happy new year";
String str2 = "appy";
輸出:h new year
思路分析:結果得放到一個List當中,下標i遍歷str1,如果包含str2,i++,不包含,放入List當中。
public static List<Character> func(String str1,String str2) {
List<Character> ret = new ArrayList<>();
for (int i = 0; i < str1.length(); i++) {
char ch = str1.charAt(i);
if(!str2.contains(ch+"")){
ret.add(ch);
}
}
return ret;
}
3.楊輝三角
思路分析:
List裏面放了一個List,相當於一個二維數組。
①進來時放一個1
②中間:3,1 = 2,1+2,0 --》 [i,j] = [i-1,j] + [i-1,j-1]
③出去時放一個1
//numRows:你的行數
public static List<List<Integer>> generate(int numRows) {
List<List<Integer>> triangle = new ArrayList<>();
if(numRows == 0) {
return triangle;
}
triangle.add(new ArrayList<>());//0
triangle.get(0).add(1);
//行數
for (int i = 1; i < numRows; i++) {
List<Integer> curRow = new ArrayList<>();
curRow.add(1);
//上一行
List<Integer> prevRow = triangle.get(i-1);
//第i行的第j列
for (int j = 1; j < i; j++) {
int tmp = prevRow.get(j-1)+prevRow.get(j);
curRow.add(tmp);
}
curRow.add(1);
triangle.add(curRow);
}
return triangle;
}
4.自己練習的小Demo撲克牌哈哈哈
包括買牌、洗牌、發牌等操作。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class Card {
public String suit;
public int rank;
public Card(String suit,int rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return String.format("[%s %d]", suit, rank);
}
}
public class CardDemo {
public static final String[] suits = {"♥","♦", "♣","♠"};
public List<Card> buyPuke() {
List<Card> deck = new ArrayList<>();
for (int i = 0; i < 4 ; i++) {
for (int j = 1; j <= 13 ; j++) {
String suit = suits[i];
//int rank = j;
Card card = new Card(suit,j);
deck.add(card);
}
}
return deck;
}
private void swap(List<Card> deck,int start,int end) {
Card tmp = deck.get(start);
deck.set(start,deck.get(end));
deck.set(end,tmp);
}
//洗牌
public void shuffle(List<Card> deck) {
Random random = new Random(20191208); //僞隨機
for (int i = deck.size()-1; i > 0 ; i--) {
int index = random.nextInt(i);//[0,i)
swap(deck,i,index);
}
}
public static void main(String[] args) {
CardDemo cardDemo = new CardDemo();
List<Card> list = cardDemo.buyPuke();
System.out.println(list);
cardDemo.shuffle(list);
//發牌 3個人每個人最多發5張牌
System.out.println("發牌");
List<List<Card>> hands = new ArrayList<>();
List<Card> human1 = new ArrayList<>();
List<Card> human2 = new ArrayList<>();
List<Card> human3 = new ArrayList<>();
hands.add(human1);
hands.add(human2);
hands.add(human3);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
hands.get(i).add(list.remove(0));
}
}
System.out.println("第一個人的牌");
System.out.println(human1);
}
}
嘖嘖。。