文章目录
一. 线性表
线性表有顺序表,链表,栈和队列
存储结构分为线性存储(线性表)和链式存储(链式表)
二. 线性表
线性表通常用数组来实现
public class Emptyfull extends RuntimeException{
public Emptyfull(){
}
public Emptyfull(String message){
super(message);
}
}
public class FindFulException extends RuntimeException{
public FindFulException(){
}
public FindFulException(String message){
super(message);
}
}
public class ListWrongful extends RuntimeException{
public ListWrongful(){
}
public ListWrongful(String message) {
super(message);
}
}
import java.util.Arrays;
public class MyArrayList {
private int[] list;
private int usesize;
public MyArrayList(){
list = new int[10];
}
public boolean isFull(){
return usesize >= list.length;
}
public boolean isEmpty(){
return this.usesize == 0;
}
//默认最后加
public void add(int data){
if (isFull()){
System.out.println("已满,准备扩容中...");
this.list = Arrays.copyOf(this.list, 2 * this.list.length);
System.out.println("扩容成功");
}
this.list[this.usesize] = data;
this.usesize++;
}
public void add(int pos, int data) throws ListWrongful{
if (isFull()){
System.out.println("已满,准备扩容中...");
list = Arrays.copyOf(list, 2 * usesize);
System.out.println("扩容成功");
}
if (pos < 0 || pos > usesize) {
throw new ListWrongful("pos不合法异常");
}
for (int i = usesize - 1; i >= pos; i--){
list[i + 1] = list[i];
}
list[pos] = data;
usesize++;
}
public boolean contains(int toFind){
for (int i = 0; i < this.usesize; i++){
if(toFind == this.list[i]){
return true;
}
}
return false;
}
public int indexOf(int toFind){
for(int i =0; i < this.usesize; i++){
if (toFind == list[i]){
return i;
}
}
return -1;
}
public int get(int pos)throws Emptyfull{
if (isEmpty()){
throw new Emptyfull("获取元素时线性表为空异常");
}
if (pos < 0 || pos >= usesize){
throw new ListWrongful("获取元素时,pos不合法异常");
}
return list[pos];
}
public void set (int pos, int value)throws Emptyfull, ListWrongful{
if(isEmpty()){
throw new Emptyfull("修改元素时,pos不合法异常");
}
if (pos < 0 || pos >= usesize){
throw new ListWrongful("修改元素时,pos不合法异常");
}
list[pos] = value;
}
public void remove(int toRemove)throws Emptyfull, FindFulException{
if (isEmpty()) {
throw new Emptyfull("删除元素时,线性表为空");
}
if(indexOf(toRemove) < 0){
throw new FindFulException("删除元素时,未找到该元素");
}
for(int i = indexOf(toRemove); i < this.usesize - 1; i++){
this.list[i] = list[i + 1];
}
this.list[usesize - 1] = 0;
this.usesize--;
}
public int size(){
return usesize;
}
public void clear(){
this.usesize = 0;
}
public void display(){
for(int i = 0; i < usesize; i++){
System.out.print(list[i] + " ");
}
System.out.println();
}
}
public class ArrayList {
public static void main(String[] args) {
MyArrayList myarraylist = new MyArrayList();
myarraylist.add(1);
myarraylist.add(2);
myarraylist.add(3);
try{
myarraylist.add(10, 10);
}
catch(ListWrongful e){
e.printStackTrace();
}
myarraylist.display();
}
}
Arraylist简介
Arraylist是以泛型方式实现的,使用时需要实例化
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<Integer>();
array.add(1);
//array.add("wang");
}
}
ArrayList底层是一段连续的空间,可以动态扩容,是一个动态的线性表
Arraylist 使用
Arraylist有三种构造方法
Arraylist 的常见操作
需要注意的有:
remove方法:
//删除下标位1的元素;
list.remove(1);
//删除元素值为1的元素
list.remove(new Integer(1));
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//删除下标位1的元素;
list.remove(1);
System.out.println(list);
//删除元素值为1的元素
list.remove(new Integer(1));
System.out.println(list);
}
}
sublist方法:
List<Integer> list1 = list.subList(1,2);
System.out.println(list1);
list.set(1, 9);
System.out.println(list+" "+list1);
list1 截取list时是将list中对应下标元素的地址赋值给了list
迭代器Arraylist的遍历
Iterator迭代器:
Iterator<Integer> list2 = list.iterator();
while(list2.hasNext()){
System.out.print(list2.next() + " ");
}
ListIterator 迭代器:
ListIterator<Integer> list3= list.listIterator();
while(list3.hasNext()){
System.out.print(list3.next());
}
void remove():删除迭代器刚越过的元素
Arraylist的具体使用
小练习
1 集合的排序(Collections.sort)
Arraylist可以存放指定自定义类型
Collections.sort可以对Arraylist进行排序,自定义类需要实现Comparable.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
class Student implements Comparable<Student>{
String name;
int age;
double score;
public Student(String name, int age, double score){
this.age = age;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
@Override
public int compareTo(Student o) {
return this.name.compareTo(o.name);
}
}
public class Test1 {
public static void main(String[] args) {
ArrayList<Student> array = new ArrayList<Student>();
array.add(new Student("e张三", 19, 78.45));
array.add(new Student("a李四", 30, 89.34));
array.add(new Student("r王五", 20, 90.23));
//System.out.println(array);
Collections.sort(array);
Iterator<Student> array1 = array.iterator();
while(array1.hasNext()){
System.out.println(array1.next());
}
}
}
2. 删除第一个字符串中在第二个字符串中出现的字符
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
String s1 = "welcome to \"Shangxi\"";
String s2 = "come";
ArrayList<Character> array = new ArrayList<>();
for(int i = 0; i < s1.length(); i++){
char s = s1.charAt(i);
if (!s2.contains(s + "")){
System.out.print(s);
array.add(s);
}
}
}
}
3. 实现一个简单洗牌算法
一个牌类:
package dome;
public class Poker {
private String decor;
private int number;
public String getDecor() {
return decor;
}
public void setDecor(String decor) {
this.decor = decor;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public Poker(String decor, int number){
this.decor = decor;
this.number = number;
}
public String toString(){
return decor + " " + number;
}
}
一副牌类:
package dome;
import java.util.ArrayList;
import java.util.Random;
public class Pokers {
private String[] decors = {"♥", "♠", "♣", "♦"};
ArrayList<Poker> pokers = new ArrayList<>();
public ArrayList<Poker> buyPoker () {
for(int i = 0; i < 4; i++){
for(int j = 1; j <= 13; j++){
pokers.add(new Poker(decors[i], j));
}
}
return pokers;
}
public void swap(ArrayList<Poker> pokers, int i, int j){
Poker poker = pokers.get(i);
pokers.set(i, pokers.get(j));
pokers.set(j, poker);
}
public ArrayList<Poker> shuffle(ArrayList<Poker> decors) {
Random random = new Random();
for(int i = decors.size() - 1; i >0; i--){
int j = random.nextInt(i);
swap(pokers, i, j);
}
return decors;
}
public String toString(){
return "pokers" + pokers ;
}
}
测试类:
package dome;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
Pokers pokers = new Pokers();
System.out.println("买牌");
pokers.buyPoker();
System.out.println(pokers);
System.out.println("洗牌");
pokers.shuffle(pokers.pokers);
System.out.println(pokers);
System.out.println("发牌中...");
//创建三个人
ArrayList<ArrayList<Poker>> person = new ArrayList<>();
ArrayList<Poker> person1 = new ArrayList<Poker>();
ArrayList<Poker> person2 = new ArrayList<Poker>();
ArrayList<Poker> person3 = new ArrayList<Poker>();
person.add(person1);
person.add(person2);
person.add(person3);
//发牌给三个人,每人五张牌
for(int i = 0; i < 5; i++){
for(int j = 0; j < 3; j++){
person.get(j).add(pokers.pokers.remove(0));
}
}
System.out.println("揭牌:");
System.out.println("第一个人" + person1);
System.out.println("第二个人" + person2);
System.out.println("第三个人" + person3);
System.out.println("牌堆剩余牌:" + pokers);
}
}
4. 杨辉三角
import java.util.ArrayList;
public class Test {
public static ArrayList<ArrayList<Integer>> creat (int c1){
ArrayList<ArrayList<Integer>> yanghui = new ArrayList<>();
ArrayList<Integer> first1 = new ArrayList();
first1.add(1);
yanghui.add(first1);
System.out.println(first1);
for (int j = 1; j < c1; j++){
ArrayList<Integer> second = new ArrayList<>();
second.add(1);
for(int i = 1; i < j; i++){
second.add(i, yanghui.get(j - 1).get(i) + yanghui.get(j - 1).get(i - 1));
}
second.add(1);
yanghui.add(second);
System.out.println(second);
}
return yanghui;
}
public static void main(String args[]){
creat(5);
}
}
写这个算法时存在的问题是:在第一个for循环内没有新建一个顺序表,而是在原有顺序表上进行操作,这样是不行的,因为由于使用的是同一个顺序表,所以在操作顺序表中的第i个顺序表时第i-1个顺序表也会发生变化.