课堂作业:
1./*练习:比较Vector\ArrayList\LinkedList在头部增删元素的效率和查找头部元素的效率
提示:用System.currentTimeMillis()计算时间差*/
/*运行结果:
6
6
0
5
6
0
0
0
0*///(可能不太一致,但emmm链表真的快)
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Vector;
public class Demo01 {
public static void main(String[] args) {
Vector vector = new Vector();
ArrayList arrayList = new ArrayList();
LinkedList linkedList = new LinkedList();
for(long n = 1; n <= 10000000; n++) {
vector.add(n);
arrayList.add(n);
linkedList.add(n);
}
System.out.println(vectorAdd(vector));
System.out.println(vectorRemove(vector));
System.out.println(vectorGet(vector));
System.out.println(arrayListAdd(arrayList));
System.out.println(arrayListRemove(arrayList));
System.out.println(arrayListGet(arrayList));
System.out.println(linkedListAdd(linkedList));
System.out.println(linkedListRemove(linkedList));
System.out.println(linkedListGet(linkedList));
}
private static long vectorRemove(Vector vector) {
//Vector在头部删除元素
long t1 = System.currentTimeMillis();
vector.remove(0);
long t2 = System.currentTimeMillis();
return t2 - t1;
}
private static long vectorAdd(Vector vector) {
//Vector在头部增加元素
long t1 = System.currentTimeMillis();
vector.add(0, 2);
long t2 = System.currentTimeMillis();
return t2 - t1;
}
private static long vectorGet(Vector vector) {
//Verctor查找头部元素
long t1 = System.currentTimeMillis();
vector.get(0);
long t2 = System.currentTimeMillis();
return t2 - t1;
}
private static long arrayListRemove(ArrayList arrayList) {
//ArrayList在头部删除元素
long t1 = System.currentTimeMillis();
arrayList.remove(0);
long t2 = System.currentTimeMillis();
return t2 - t1;
}
private static long arrayListAdd(ArrayList arrayList) {
//ArrayList在头部增加元素
long t1 = System.currentTimeMillis();
arrayList.add(0, 2);
long t2 = System.currentTimeMillis();
return t2 - t1;
}
private static long arrayListGet(ArrayList arrayList) {
//ArrayList查找头部元素
long t1 = System.currentTimeMillis();
arrayList.get(0);
long t2 = System.currentTimeMillis();
return t2 - t1;
}
private static long linkedListRemove(LinkedList linkedList) {
//LinkedList在头部删除元素
long t1 = System.currentTimeMillis();
linkedList.remove(0);
long t2 = System.currentTimeMillis();
return t2 - t1;
}
private static long linkedListAdd(LinkedList linkedList) {
//LinkedList在头部增加元素
long t1 = System.currentTimeMillis();
linkedList.add(0, 2);
long t2 = System.currentTimeMillis();
return t2 - t1;
}
private static long linkedListGet(LinkedList linkedList) {
//LinkedList查找头部元素
long t1 = System.currentTimeMillis();
linkedList.get(0);
long t2 = System.currentTimeMillis();
return t2 - t1;
}
}
2./*随机生成十个二十到四十之间的随机数,存储在合适的集合中,并且进行遍历
键盘录入一个字符串,输出其中的字符,相同的字符只输出一次.*/
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
test01HashSet();
test02HashSet();
}
private static void test02HashSet() {
System.out.println("************");
Scanner sc = new Scanner(System.in);
System.out.println("请录入一个字符串:");
String line = sc.nextLine();
HashSet hs = new HashSet();
char[] chs = line.toCharArray();
for(int n = 0; n < chs.length; n++) {
hs.add(chs[n]);
}
Iterator iterator = hs.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
private static void test01HashSet() {
Random r = new Random();
HashSet hs = new HashSet();
while(hs.size() < 10) {
int num = r.nextInt(21) + 20;
hs.add(num);
}
Iterator iterator = hs.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
3.1 /*模拟栈和队列的操作(封装成集合,最好用LinkedList)
栈:先进后出(添加和删除的方法) 为空(自定义异常)
队列:先进先出(添加和删除的方法)*/
栈
import java.awt.List;
import java.util.LinkedList;
public class Demo03 {
public static void main(String[] args) {
MyStack ms = new MyStack();
//模拟进栈
ms.in("a");
ms.in("b");
ms.in("c");
ms.in("d");
while(!ms.isEmpty()) { // 为空判断,不为空就弹栈
System.out.println(ms.out()); //模拟弹栈
}
}
}
class MyStack{
private LinkedList list = new LinkedList();
//模拟进栈
public void in(Object obj) {
list.addLast(obj);
}
//模拟出栈
public Object out() {
return list.removeLast();
}
//判断是否为空
public boolean isEmpty() {
return list.isEmpty();
}
}
3.2/*模拟栈和队列的操作(封装成集合,最好用LinkedList)
栈:先进后出(添加和删除的方法) 为空(自定义异常)
队列:先进先出(添加和删除的方法)*/
队列
import java.util.LinkedList;
public class Demo032 {
public static void main(String[] args) {
MyQueue mq = new MyQueue();
//模拟进队列
mq.in(1);
mq.in(2);
mq.in(3);
mq.in(4);
while(!mq.isEmpty()) {//为空判断,不为空就出队列
System.out.println(mq.out());//模拟出队列
}
}
}
class MyQueue{
private LinkedList list = new LinkedList();
//模拟进队列
public void in(Object obj) {
list.addLast(obj);
}
//模拟出队列
public Object out() {
return list.removeFirst();
}
//判断是否为空
public boolean isEmpty() {
return list.isEmpty();
}
}
作业
1./*分析以下需求,并用代码实现:
(1)有如下代码:
List<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
System.out.println(frequency(list, "a")); // 3
System.out.println(frequency(list, "b")); // 2
System.out.println(frequency(list, "c")); // 1
System.out.println(frequency(list, "d")); // 5
System.out.println(frequency(list, "xxx")); // 0
- 定义方法统计集合中指定元素出现的次数,如"a" 3,"b" 2,"c" 1*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
System.out.println(frequency(list, "a")); // 3
System.out.println(frequency(list, "b")); // 2
System.out.println(frequency(list, "c")); // 1
System.out.println(frequency(list, "d")); // 5
System.out.println(frequency(list, "xxx")); // 0
}
private static int frequency(List list, String string) {
int count = 0;
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
if(iterator.next().equals(string))
count++;
}
return count;
}
}
2./*分析以下需求,并用代码实现:
(1)生成10个1至100之间的随机整数(不能重复),存入一个List集合
(2)编写方法对List集合进行排序
(2)然后利用迭代器遍历集合元素并输出
(3)如:15 18 20 40 46 60 65 70 75 91*/
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class Test02 {
public static void main(String[] args) {
Random r = new Random();
HashSet hs = new HashSet();
while(hs.size()<10) {
int num = r.nextInt(100)+1;
hs.add(num);
}
List list = new ArrayList();
list.addAll(hs);
sortList(list);
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
/*for(int n = 0; n < list.size()-1;n++) {
System.out.println(list.get(n));
}*/
}
private static void sortList(List list) {
list.sort(null);
//默认升序,调换的话需要实现comparable接口,重写compareTo方法
}
}
3. /*编写一个类Book,具有name,price,press,author
然后创建5个对象放入ArrayList中,并实现按照price大小排序,
然后遍历ArrayList输出每个Book对象, 使用toString 方法打印。*/
import java.util.ArrayList;
import java.util.Comparator;
public class Test03 {
public static void main(String[] args) {
Book book1 = new Book("活着1",26.00,"作家出版社1","余华1");
Book book2 = new Book("活着2",23.00,"作家出版社2","余华2");
Book book3 = new Book("活着3",29.00,"作家出版社3","余华3");
Book book4 = new Book("活着4",33.00,"作家出版社4","余华4");
Book book5 = new Book("活着5",18.00,"作家出版社5","余华5");
ArrayList list = new ArrayList();
list.add(book1);
list.add(book2);
list.add(book3);
list.add(book4);
list.add(book5);
list.sort(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Book b1 = (Book)o1;
Book b2 = (Book)o2;
if(b1.getPrice() > b2.getPrice())
return 1;
return -1;
}
});
for(int n = 0; n < list.size(); n++) {
System.out.println(list.get(n));
}
}
}
class Book{
private String name;
private double price;
private String press;//出版社
private String author;
public Book() {
super();
// TODO Auto-generated constructor stub
}
public Book(String name, double price, String press, String author) {
super();
this.name = name;
this.price = price;
this.press = press;
this.author = author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book [name=" + name + ", price=" + price + ", press=" + press + ", author=" + author + "]";
}
}
4. /*把如下元素存入List集合
"aaa" "bbb" "aaa" "abc" "xyz" "123" "xyz"
去掉重复元素*/
import java.util.ArrayList;
import java.util.HashSet;
public class Test04 {
public static void main(String[] args) {
HashSet hs = new HashSet();
ArrayList list = new ArrayList();
hs.add("aaa");
hs.add("bbb");
hs.add("aaa");
hs.add("abc");
hs.add("xyz");
hs.add("123");
hs.add("xyz");
list.addAll(hs);
System.out.println(list);
}
}
5 /*已知 Student类 属性包括 int id,String name
创建 5个Student对象存入 List中
Student s1 = new Student(1,"aaa");
Student s2 = new Student(2,"bbb");
Student s3 = new Student(3,"ccc");
Student s4 = new Student(4,"ddd");
Student s5 = new Student(1,"aaa");
去掉重复元素:当Student的id和name值都相同时,任务是重复元素 */
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
public class Test05 {
public static void main(String[] args) {
Student s1 = new Student(1,"aaa");
Student s2 = new Student(2,"bbb");
Student s3 = new Student(3,"ccc");
Student s4 = new Student(4,"ddd");
Student s5 = new Student(1,"aaa");
HashSet hs = new HashSet();
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
hs.add(s5);
List list = new ArrayList();
list.addAll(hs);
for(int n = 0; n < list.size();n++) {
System.out.println(list.get(n));
}
}
}
class Student{
private int id;
private String name;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
@Override
public int hashCode() {//返回哈希码
return Objects.hash(id,name);//为输入值序列生成哈希码。
}
@Override
public boolean equals(Object obj) {
Student stu = (Student)obj;
return stu.getId()==id && stu.getName().equals(name);
}
}
6. /*String s = "...(...[....]....{....}..)...(...)..";
判断括号是否匹配 */
import java.util.Stack;
public class Test07 {
public static void main(String[] args) {
String s = "...(...[....]....{....}..)...(...)..";
System.out.println("The result is:" + isValid(s));
}
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>(); //创建一个栈
for (int i = 0; i < s.length(); i++) {
if ((s.charAt(i) == '(') || (s.charAt(i) == '[') || (s.charAt(i) == '{')) {
// 如果是左括号,则将其放入栈内
stack.push(s.charAt(i));//进栈
}
if ((s.charAt(i) == ')') || (s.charAt(i) == ']') || (s.charAt(i) == '}')) {
// 如果是右括号
if (stack.empty()) {
// 如果栈为空,则证明括号不匹配,返回false
return false;
}
if ((stack.peek() == '(' && s.charAt(i) == ')') || (stack.peek() == '[' && s.charAt(i) == ']') || (stack.peek() == '{' && s.charAt(i) == '}') ) { // 如果栈顶元素和下一个右括号相匹配,则将其栈顶元素出栈
//stack.peek() 查看此堆栈顶部的对象,而不从堆栈中删除它
stack.pop();
//stack.pop() 删除此堆栈顶部的对象,并将该对象作为此函数的值返回
}
}
}
if (stack.empty()) {
// 遍历循环结束后,如果发现栈里为空,则证明括号匹配完毕;否则括号不匹配
return true;
}
return false;
}
}