练习1:创建一个新类Gerbil(沙鼠),包含int gerbilNumber,在构造器中初始化它。添加一个方法hop(),用以打印沙鼠的号码以及它正在跳跃的信息。创建一个ArrayList,并向其中添加一串Gerbil对象,使用get()遍历List,并且对每个Gerbil调用hop()。

package testPackage3;

import java.util.ArrayList;

public class Gerbil {
    private int gerbilNumber;
    public Gerbil(int gerbilNumber) {
        this.gerbilNumber = gerbilNumber;
    }

    public void hop() {
        System.out.println("沙鼠" + gerbilNumber);
    }

    public static void main(String[] args) {
        ArrayList<Gerbil> gerbils = new ArrayList<Gerbil>();
        for (int i = 0; i <= 5; i++) {
            gerbils.add(new Gerbil(i));
        }
        for (Gerbil g : gerbils) {
            g.hop();
        }
    }
}
结果显示
娌欓紶0
娌欓紶1
娌欓紶2
娌欓紶3
娌欓紶4
娌欓紶5

Process finished with exit code 0

 练习2:修改SimpleCollection.java,使用Set来表示c

package testPackage3;

import java.util.ArrayList;
import java.util.Collection;

public class SimpleCollection {
    public static void main(String[] args) {
        Collection<Integer> c = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            c.add(i);
        }
        for (Integer integer : c) {
            System.out.print(integer + " ");
        }
    }
}

运行结果:

0 1 2 3 4 5 6 7 8 9 
Process finished with exit code 0

练习3:修改innerclasses/Sequence.java,使你可以向其中添加任意数量的元素。

package testPackage3;

import java.util.ArrayList;

interface Selector {
    boolean end();

    Object current();

    void next();
}

public class Sequence {
    private ArrayList<Object> items = new ArrayList<Object>();

    public void add(Object x) {
        items.add(x);
    }

    private class SequenceSelector implements Selector {
        private int i = 0;

        public boolean end() {
            return i == items.size();
        }

        public Object current() {
            return items.get(i);
        }

        public void next() {
            i++;
        }
    }

    public Selector selector() {
        return new SequenceSelector();
    }

    public static void main(String[] args) {
        Sequence sequence = new Sequence();
        sequence.add(0.1);
        sequence.add(100);
        sequence.add("你好");
        sequence.add("hello");
        Selector selector = sequence.selector();
        while (!selector.end()) {
            System.out.print(selector.current() + " ");
            selector.next();
        }
    }
}

运行结果:

0.1 100 浣犲ソ hello 
Process finished with exit code 0

练习4:创建一个生成器类,它可以在每次调用其next()方法时,产生你由你最喜欢的电影(你可以使用Snow White 或Star Wars)的字符构成的名字(作为String对象)。在字符列表中的电影名字用完之后,循环到这个字符列表的开始处。使用这个生成器来填充数组、ArrayList、LinkedList、HashSet、LinkedHashSet和TreeSet,然后打印每一个容器。

package testPackage3;

import java.util.*;

public class CollectionSetMap {
    static int i;
    static String[] s = {"Snow White", "Star Wars", "Play Japanese", "Make Aduowan"};
    static String next() {
        if (i <= 3) {
            return s[i++];
        }else {
            return s[0];
        }
    }
    static Collection cc(Collection<String> collection) {
        for (int i = 0; i < 4; i++) {
            collection.add(next());
        }
        return collection;
    }
    public static void main(String[] args) {
        System.out.println(" ");
        System.out.println(cc(new ArrayList<String>()));
        System.out.println(cc(new LinkedList<String>()));
        System.out.println(cc(new HashSet<String>()));
        System.out.println(cc(new LinkedHashSet<String>()));
        System.out.println(cc(new TreeSet<String>()));
    }
}

这个有点问题,,,目前解决不了,以后再来看看。。

结果显示:

[Snow White, Star Wars, Play Japanese, Make Aduowan]
[Snow White, Snow White, Snow White, Snow White]
[Snow White]
[Snow White]
[Snow White]

Process finished with exit code 0

练习5:修改ListFeatures.java,让它使用Integer(记住自动包装机制!)而不是Pet,并解释在结果上有何不同。

package testPackage3;

import java.util.*;

public class ListFeatures {

    public static List<Integer> change(int length, int n) {
        Random rand = new Random();
        List<Integer> a = new ArrayList<Integer>();
        for (int i = 0; i < length; i++)
            a.add(rand.nextInt(n));
        return a;
    }

    public static void main(String[] args) {
        Random rand = new Random(47);
        List<Integer> a = change(5, 10);
        System.out.println("1: " + a);
        Integer b = rand.nextInt(10);
        a.add(b);
        System.out.println("2: " + a);
        System.out.println("3: " + a.contains(b));
        a.remove(b);
        Integer p = a.get(2);
        System.out.println("4: " + p + " " + a.indexOf(p));
        Integer c = rand.nextInt(10);
        System.out.println("5: " + a.indexOf(c));
        System.out.println("6: " + a.remove(c));
        System.out.println("7: " + a.remove(p));
        System.out.println("8: " + a);
        a.add(3, rand.nextInt(10));
        System.out.println("9: " + a);
        List<Integer> sub = a.subList(1, 4);
        System.out.println("sublist: " + sub);
        System.out.println("10: " + a.containsAll(sub));
        Collections.sort(sub);
        System.out.println("sorted sublist: " + sub);
        System.out.println("11: " + a.containsAll(sub));
        Collections.shuffle(sub, rand);
        System.out.println("shuffled sublist: " + sub);
        System.out.println("12: " + a.containsAll(sub));
        List<Integer> copy = new ArrayList<Integer>(a);
        sub = Arrays.asList(a.get(1), a.get(4));
        System.out.println("sub: " + sub);
        copy.retainAll(sub);
        System.out.println("13: " + copy);
        copy = new ArrayList<Integer>(a);
        copy.remove(2);
        System.out.println("14: " + copy);
        copy.removeAll(sub);
        System.out.println("15: " + copy);
        if (copy.size() > 1)
            copy.set(1, 8);
        System.out.println("16: " + copy);
        if (copy.size() > 2)
            copy.addAll(2, sub);
        System.out.println("17: " + copy);
        System.out.println("18: " + a.isEmpty());
        a.clear();
        System.out.println("19: " + a);
        System.out.println("20: " + a.isEmpty());
        a.addAll(change(4, 10));
        System.out.println("21: " + a);
        Object[] o = a.toArray();
        System.out.println("22: " + o[3]);
        Integer[] f = a.toArray(new Integer[0]);
        System.out.println("23: " + f[3]);
    }
}

结果显示: 

1: [6, 9, 5, 1, 0]
2: [6, 9, 5, 1, 0, 8]
3: true
4: 5 2
5: 2
6: true
7: false
8: [6, 9, 1, 0]
9: [6, 9, 1, 3, 0]
sublist: [9, 1, 3]
10: true
sorted sublist: [1, 3, 9]
11: true
shuffled sublist: [3, 1, 9]
12: true
sub: [3, 0]
13: [3, 0]
14: [6, 3, 9, 0]
15: [6, 9]
16: [6, 8]
17: [6, 8]
18: false
19: []
20: true
21: [5, 7, 9, 3]
22: 3
23: 3

Process finished with exit code 0

 容器类不能放基本类型的,放进放出都要先包装和解包。 

练习6:修改ListFeatures.java,让它使用String而不是Pet,并解释在结果上有何不同。

package testPackage3;

import java.util.*;

public class ListFeatures1 {


    public static void main(String[] args) {
        Random rand = new Random(47);
        List<String> Str = new ArrayList<String>();
        String a1 = "rat";
        Str.add(a1);
        String a2 = "cat";
        Str.add(a2);
        String a3 = "dog";
        Str.add(a3);
        List<String> Str1 = new ArrayList<String>();
        String a4 = "rat";
        Str1.add(a1);
        String a5 = "cat";
        Str1.add(a2);
        String a6 = "dog";
        Str1.add(a3);
        System.out.println("1: " + Str);
        String b = "god";
        Str.add(b);
        System.out.println("2: " + Str);
        System.out.println("3: " + Str.contains(b));
        Str.remove(b);
        String p = Str.get(2);
        System.out.println("4: " + p + " " + Str.indexOf(p));
        String c = "smb";
        System.out.println("5: " + Str.indexOf(c));
        System.out.println("6: " + Str.remove(c));
        System.out.println("7: " + Str.remove(p));
        System.out.println("8: " + Str);
        Str.add(1, "rmb");
        System.out.println("9: " + Str);
        List<String> sub = Str.subList(1, 2);
        System.out.println("sublist: " + sub);
        System.out.println("10: " + Str.containsAll(sub));
        Collections.sort(sub);
        System.out.println("sorted sublist: " + sub);
        System.out.println("11: " + Str.containsAll(sub));
        Collections.shuffle(sub, rand);
        System.out.println("shuffled sublist: " + sub);
        System.out.println("12: " + Str.containsAll(sub));
        List<String> copy = new ArrayList<String>(Str);
        sub = Arrays.asList(Str.get(0), Str.get(2));
        System.out.println("sub: " + sub);
        copy.retainAll(sub);
        System.out.println("13: " + copy);
        copy = new ArrayList<String>(Str);
        copy.remove(2);
        System.out.println("14: " + copy);
        copy.removeAll(sub);
        System.out.println("15: " + copy);
        copy.set(0,"tmd");
        System.out.println("16: " + copy);
        copy.addAll(0, sub);
        System.out.println("17: " + copy);
        System.out.println("18: " + Str.isEmpty());
        Str.clear();
        System.out.println("19: " + Str);
        System.out.println("20: " + Str.isEmpty());
        Str.addAll(0,Str1);//这个地方str调用不了ArrayList()方法,目前不知道怎么解决,先备注着。
        System.out.println("21: " + Str);
        Object[] o = Str.toArray();
        System.out.println("22: " + o[2]);
        String[] f = Str.toArray(new String[0]);
        System.out.println("23: " + f[1]);
    }
}

结果显示:        

1: [rat, cat, dog]
2: [rat, cat, dog, god]
3: true
4: dog 2
5: -1
6: false
7: true
8: [rat, cat]
9: [rat, rmb, cat]
sublist: [rmb]
10: true
sorted sublist: [rmb]
11: true
shuffled sublist: [rmb]
12: true
sub: [rat, cat]
13: [rat, cat]
14: [rat, rmb]
15: [rmb]
16: [tmd]
17: [rat, cat, tmd]
18: false
19: []
20: true
21: [rat, cat, dog]
22: dog
23: cat

Process finished with exit code 0

 不太好,需要修改。

练习7:创建一个类,然后创建一个用你的类的对象进行过初始化的数组。通过使用subList()方法,创建你的List的子集,然后在你的List中移除这个子集。

package testPackage3;

import java.util.ArrayList;
import java.util.List;

public class Asublist {
    static class A3{
       
    }

    public static void main(String[] args) {
        List<A3> ab = new ArrayList<A3>();
        for (int i = 0; i < 3; i++) {
            ab.add(new A3());
        }
        System.out.println(ab);
        List list = ab.subList(0,2);
        System.out.println(list);
        list.remove(list);
        System.out.println(ab);
    }
}

结果显示:

[testPackage3.Asublist$A3@1b6d3586, testPackage3.Asublist$A3@4554617c, testPackage3.Asublist$A3@74a14482]
[testPackage3.Asublist$A3@1b6d3586, testPackage3.Asublist$A3@4554617c]
[testPackage3.Asublist$A3@1b6d3586, testPackage3.Asublist$A3@4554617c, testPackage3.Asublist$A3@74a14482]

Process finished with exit code 0

练习8:修改练习1,以便调用hop()时使用Iterator遍历List。

package testPackage3;

import java.util.ArrayList;
import java.util.Iterator;

public class GerbilIterator {
    private int gerbilNumber;

    public GerbilIterator(int gerbilNumber) {
        this.gerbilNumber = gerbilNumber;
    }

    public void hop(Iterator<GerbilIterator> it) {
        while (it.hasNext()) {
            GerbilIterator gerbilIterator = it.next();
            System.out.println("shashu:" + gerbilIterator.gerbilNumber);
        }
    }

    public static void main(String[] args) {
        ArrayList<GerbilIterator> gerbils = new ArrayList<GerbilIterator>();
        for (int i = 0; i <= 5; i++) {
            gerbils.add(new GerbilIterator(i));
        }
        GerbilIterator g = new GerbilIterator(5);
        g.hop(gerbils.iterator());
    }
}

结果显示:

shashu:0
shashu:1
shashu:2
shashu:3
shashu:4
shashu:5

Process finished with exit code 0

练习9:修改innerclasses/Sequence.java,使得在Sequence中,用Iterator取代Selector。

package testPackage3;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

interface SelectorIterator {
    boolean end();

    Object current();

    void next();
}

public class SequenceIterator {
    private ArrayList<Object> items = new ArrayList<>();
    
    public void add(Object x) {
        items.add(x);
    }

    private class SequenceSelector implements Selector {
        
        private int i = 0;

        @Override
        public boolean end() {
            return i == items.size();
        }

        @Override
        public Object current() {
            return items.get(i);
        }

        @Override
        public void next() {
            i++;
            
        }
    }

    public static void main(String[] args) {
        List<Integer> ig = new LinkedList<>();
        for (int i = 0; i < 10; i++) {
            ig.add(i);
        }
        Iterator<Integer> it = ig.iterator();
        while (it.hasNext()){
            Integer integer = it.next();
            System.out.println(integer);
        }
        
    }
}

结果显示:

0
1
2
3
4
5
6
7
8
9

Process finished with exit code 0

感觉有点问题,,,,以后再瞅瞅

练习10:修改第8章中的练习9,使其使用一个ArrayList来存放Rodents,并使用一个Iterator来访问Rodent序列。

package testPackage3;

import java.util.ArrayList;
import java.util.Iterator;

public class RodentArrayList {
    void bit() {
        System.out.println("Rodent bit");
    }

    static class Mouse extends RodentArrayList {
        @Override
        void bit() {
            System.out.println("Mouse bit");
        }
    }

    static class Gerbil extends RodentArrayList {
        @Override
        void bit() {
            System.out.println("Gerbil bit");
        }
    }

    static class Hamster extends RodentArrayList {
        @Override
        void bit() {
            System.out.println("Hamster bit");
        }
    }

    public static void main(String[] args) {
        ArrayList<RodentArrayList> ra = new ArrayList<>();
        ra.add(new Mouse());
        ra.add(new Gerbil());
        ra.add(new Hamster());
        Iterator<RodentArrayList> itra = ra.iterator();
        while (itra.hasNext()){
            RodentArrayList rodentArrayList = itra.next();
            rodentArrayList.bit();
        }
    }
}

结果显示:

Mouse bit
Gerbil bit
Hamster bit

Process finished with exit code 0

练习11:写一个方法,使用Iterator遍历Collection,并打印容器中每个对象的toString()。填充各种类型的Collection,然后对其使用此方法。        

package testPackage3;

import java.util.*;

public class TestCollection {
    public static void printAny(Collection c){
        Iterator it = c.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + "  ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(1, 2, 3));
        LinkedList<Character> linkedList = new LinkedList<>(Arrays.asList('a', 'b', 'c'));
        HashSet<Float> hashSet = new HashSet<>(Arrays.asList(1.1f, 2.2f, 3.3f));
        TreeSet<Double> treeSet = new TreeSet<>(Arrays.asList(1.11, 2.22, 3.33));
        LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>(Arrays.asList(11, 22, 33));
        printAny(arrayList);
        printAny(linkedList);
        printAny(hashSet);
        printAny(treeSet);
        printAny(linkedHashSet);
        
    }
}

结果显示:

1  2  3  
a  b  c  
3.3  1.1  2.2  
1.11  2.22  3.33  
11  22  33  

Process finished with exit code 0

练习12:创建并组装一个List<Integer>,然后创建第二个具有相同尺寸的List<Integer>,并使用ListIterator读取第一个List中的元素,然后再将它们以反序插入到第二个列表中。

package testPackage3;

import java.util.*;

public class ListInter {
    public static void main(String[] args) {
        List<Integer> frontlist = new ArrayList<>(10);
        for (int i = 0; i < 5; i++) {
            frontlist.add(i);
        }
        System.out.println(frontlist);
        ListIterator<Integer> lit = frontlist.listIterator();
        while (lit.hasNext()){
            System.out.print(lit.next() + " ");
        }
        System.out.println();
        while (lit.hasPrevious()){
            System.out.print(lit.previous() + " ");
        }
        System.out.println();
        for (int i = 4; i >= 0 ; i--) {
            frontlist.add(i);
            
        }
        System.out.println(frontlist);
    }
}

结果显示:

[0, 1, 2, 3, 4]
0 1 2 3 4 
4 3 2 1 0 
[0, 1, 2, 3, 4, 4, 3, 2, 1, 0]

Process finished with exit code 0

反序插入应该不是最优解,暂时想不到更好的解决方案,,,,,,,,,

练习13:在innerclasses/GreenhouseController.java示例中,Controller类使用的是ArrayList,修改代码,用LinkedList替换之,并使用Iterator来循环遍历事件集。

package testPackage2;


import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;


public class Controller2 {
    List<Event> eventList = new LinkedList<>();

    public void addEvent(Event e) {
        eventList.add(e);
    }

    public void run() {
        while (eventList.size() > 0) {
            // 由于会对LinkedList产生结构性修改(如Bell事件触发的action(),会将
            // 自己添加到LinkedList里等),因此需要拷贝一个副本进行操作。
            List<Event> copyEventList = new LinkedList<>(eventList);
            Iterator<Event> it = copyEventList.iterator();
            while (it.hasNext()) {
                Event e = it.next();
                if (e.ready()) {
                    System.out.println(e);
                    e.action();
                    it.remove();
                }
            }
        }
    }
}

结果显示:

无,太长了,需要暂停的。

练习14:创建一个空的LinkedList<Integer>,通过使用ListIterator,将若干个Integer插入这个List中,插入时,总是将它们插入到List的中间。 

package testPackage3;

import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

public class AddLinkedList {
    public static void main(String[] args) {
        List<Integer> list = new LinkedList<>();
        for (int i = 0; i < 10; i++) {
            ListIterator<Integer> it = list.listIterator(list.size()/2);
            it.add(i);
            System.out.println(list);
        }
    }
}

结果显示:

[0]
[1, 0]
[1, 2, 0]
[1, 3, 2, 0]
[1, 3, 4, 2, 0]
[1, 3, 5, 4, 2, 0]
[1, 3, 5, 6, 4, 2, 0]
[1, 3, 5, 7, 6, 4, 2, 0]
[1, 3, 5, 7, 8, 6, 4, 2, 0]
[1, 3, 5, 7, 9, 8, 6, 4, 2, 0]

Process finished with exit code 0

 练习15:栈在编程语言中经常用来对表达式求值。请使用net.mindview.util.Stack对下面表达式求值,其中“+”表示“将后面的字母压进栈”,而“-”表示“弹出栈顶字母并打印它”:“+U+n+c---+e+r+t---+a-+i-+n+t+y---+ -+r+u--+l+e+s---”

public static void main(String[] args) {
        String s = "+U+n+c---+e+r+t---+a-+i-+n+t+y---+ -+r+u--+l+e+s---";
        Stack<Character> Sc = new Stack<Character>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '+') {
                Sc.push(s.charAt(++i));
            } else if (c == '-') {
                System.out.print(Sc.pop());
            }
        }
        System.out.println();
    }

结果显示:

cnUtreaiytn ursel

Process finished with exit code 0

练习16:创建一个元音字母Set。对UniqueWords.java操作,计数并显示在每一个输入单词中的元音字母数量,并显示输入文件中的所有元音字母的数量总和。

package testPackage3;

import net.mindview.util.TextFile;

import java.util.Collections;
import java.util.Set;
import java.util.TreeSet;

public class UniqueWords {
    static void vowelCounter(Set<String> st) {
        Set<Character> vowels = new TreeSet<>();
        Collections.addAll(vowels, 'A','E','I','O','U','a','e','i','o','u');
        int allVowels = 0;
        for (String s : st) {
            int count = 0;
            for (Character c : s.toCharArray()) {
                if (vowels.contains(c)) {
                    count++;
                    allVowels++;
                }
            }
            System.out.println(s + ": " + count + ", ");
        }
        System.out.println();
        System.out.print("元音总数: " + allVowels);
    }
    
    public static void main(String[] args) {
        Set<String> words = new TreeSet<>(
                new TextFile("src/testPackage3/SetOperations.java", "\\W+"));
        System.out.println(words);
        System.out.println();
        vowelCounter(words);
    }
    
}

结果显示:

[SetOperations, class, package, public, testPackage3]

SetOperations: 6, 
class: 1, 
package: 3, 
public: 2, 
testPackage3: 4, 

元音总数: 16
Process finished with exit code 0

练习17:使用练习1中的Gerbil类,将其放入Map中,将每个Gerbil的名字String(键)与每个Gerbil(值)关联起来。为keySet()获取Iteratror,使用它遍历Map,针对每个“键”查询Gerbil,然后打印出“键”,并让gerbil执行hop()。

package testPackage3;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class GerbilMap {
    private int gerbilNumber;

    public GerbilMap(int gerbilNumber) {
        this.gerbilNumber = gerbilNumber;
    }

    public void hop() {
        System.out.print(gerbilNumber);
        System.out.print(" Jumping");
        System.out.println();
    }
    static Map<String, GerbilMap> map = new HashMap<>();
    static {
        map.put("First:", new GerbilMap(1));
        map.put("Second:", new GerbilMap(2));
        
    }
    static Iterator<String> it = map.keySet().iterator();
    public static void main(String[] args) {
        for (String s : map.keySet()){
            String c = it.next();
            System.out.print(s + " ");
            map.get(c).hop();
        }
    }
}

结果显示:

Second: 2 Jumping
First: 1 Jumping

Process finished with exit code 0

练习18:用键值对填充一个HashMap。打印结果,通过散列码来展示其排序。抽取这些键值对,按照键进行排序,并将结果置于一个LinkedHashMap中。展示其所维护的插入排序。

package testPackage3;

import java.util.*;

public class MapTest {
    static Map<String, Integer> map = new HashMap<>();

    static {
        map.put("cat:", 1);
        map.put("mouse:", 2);
        map.put("cheers:", 3);
        map.put("kasri:", 4);
    }

    public static void main(String[] args) {
        SortedMap<String, Integer> smap = new TreeMap<>(map);
        LinkedHashMap<String, Integer> lmap = new LinkedHashMap<>(smap);
        for (String e : lmap.keySet()) {
            System.out.println(e + " " + lmap.get(e));
        }
    }
}

结果显示:

cat: 1
cheers: 3
kasri: 4
mouse: 2

Process finished with exit code 0

练习19:使用HashSet和LinkedHashSet重复前一个练习。

Hashset

package testPackage3;

import java.util.*;

public class TestSet {

    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("3");
        set.add("1");
        set.add("9");
        set.add("7");
        SortedSet<String> ss = new TreeSet<>(set);
        HashSet<String> hs = new HashSet<>(ss);
        for (String e : hs) {       
            System.out.println(e);
        }
    }
}

结果显示:

1
3
7
9

Process finished with exit code 0

LinkedHashSet

package testPackage3;

import java.util.*;

public class TestSet {

    public static void main(String[] args) {
        Set<String> set = new LinkedHashSet<>();
        set.add("3");
        set.add("1");
        set.add("9");
        set.add("7");
        SortedSet<String> ss = new TreeSet<>(set);
        LinkedHashSet<String> hs = new LinkedHashSet<>(ss);
        for (String e : hs) {
            System.out.println(e);
        }
    }
}

结果显示:

1
3
7
9

Process finished with exit code 0

练习20:修改练习16,使得你可以跟踪每一个元音字母出现的次数。

package testPackage3;

import net.mindview.util.TextFile;

import java.util.*;

public class TestVowels {
    static void vowelCounter(Set<String> st) {
        Set<Character> vowels = new TreeSet<>();
        Collections.addAll(vowels, 'A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u');
        int allVowels = 0;
        Map<Character, Integer> vowelsmap = new TreeMap<>();
        for (String s : st) {
            for (Character c : s.toCharArray()) {
                if (vowels.contains(c)) {
                    Integer count = vowelsmap.get(c);
                    vowelsmap.put(c, count == null ? 1 : count + 1);
                    allVowels++;
                }
            }

        }
        System.out.println("Vowels:" + vowelsmap);
        System.out.println("Total Vowels:" + allVowels);
    }

    public static void main(String[] args) {
        Set<String> words = new TreeSet<>(new TextFile("src/testPackage3/SetOperations.java", "\\W+"));
        System.out.println(words);
        System.out.println();
        vowelCounter(words);
    }
}

结果显示:

Vowels:{O=1, a=6, e=5, i=2, o=1, u=1}
Total Vowels:16

Process finished with exit code 0

练习21:通过使用Map<String,Integer>,遵循UniqueWords.java的形式来创建一个程序,它可以对一个文件中出现的单词计数。使用带有第二个参数**String.CASE_INSENSITIVE_OREDER的Collection.sort()**方法对结果进行排序(将产生字母序),然后显示结果。

package testPackage3;

import net.mindview.util.TextFile;

import java.util.*;

public class UniqueWordsMap {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(new TextFile("src/testPackage3/SetOperations.java", "\\W+"));
        Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
        Map<String, Integer> wordMap = new LinkedHashMap<>();
        Iterator it = list.iterator();
        int totalwolds = 0;
        while (it.hasNext()) {
            String s = (String) it.next();
            if (list.contains(s)) {
                Integer count = wordMap.get(s);
                wordMap.put(s, count == null ? 1 : count + 1);
                totalwolds++;
            }
        }
        System.out.println();
        System.out.println("word count:" + wordMap);
        System.out.println();
        System.out.println("Total words:" + totalwolds);
    }
}

 结果显示:

word count:{class=1, package=1, public=1, SetOperations=1, testPackage3=1}

Total words:5

练习22:修改前一个练习,使其用一个包含有一个String域和一个计数域的类来存储每一个不同的单词,并使用一个由这些对象构成的Set来维护单词列表。

package testPackage3;

import net.mindview.util.TextFile;

import java.util.*;

class Word {
    static int totalwords = 0;
    String s;
    int count;

    Word(String s, int count) {
        this.s = s;
        this.count = count;
        totalwords++;
    }

    public String toString() {
        return s + ":" + count;
    }
}

public class UniqueWordsMap {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(new TextFile("src/testPackage3/SetOperations.java", "\\W+"));
        Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
        System.out.println("Words to count,sorted:" + list);
        Set<Word> sw = new HashSet<>();
        Iterator it = list.iterator();
        while (it.hasNext()) {
            String s = (String) it.next();
            int count = 0;
            for (int i = 0; i < list.size(); i++) {
                if (s.equals(list.get(i))) {
                    count++;
                }
            }
            Word w = new Word(s, count);
            sw.add(w);
        }
        System.out.println();
        System.out.println("word count:" + sw);
        System.out.println();
        System.out.println("Total words:" + Word.totalwords);
    }
}

结果显示:

Words to count,sorted:[class, package, public, SetOperations, testPackage3]

word count:[public:1, testPackage3:1, class:1, SetOperations:1, package:1]

Total words:5

Process finished with exit code 0

 练习23:从Statistics.java开始,写一个程序,让它重复做测试,观察是否某个数字比别的数字出现的次数多。

package testPackage3;

import java.util.*;

public class Statistics {
    public static int getBestInt(){
        Random rand = new Random(47);
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < 10000; i++) {
            int r = rand.nextInt(20);
            Integer freq = map.get(r);
            map.put(r, freq == null ? 1 : freq + 1);
        }
        int max = 0;
        for (int i = 0; i < map.keySet().size(); i++) {
            max = max < map.get(i) ? map.get(i) : max;
        }
        Set<Map.Entry<Integer, Integer>> setm = new LinkedHashSet<>(map.entrySet());
        int maxKey = 0;
        Iterator<Map.Entry<Integer, Integer>> itM = setm.iterator();
        while (itM.hasNext()) {
            Map.Entry<Integer, Integer> findMax = itM.next();
            if (findMax.getValue() == max) {
                maxKey = findMax.getKey();
            }
        }

        return maxKey;
    }
    public static void main(String[] args) {
        Map<Integer, Integer> mapI = new TreeMap<>();
        for (int i = 0; i < 10000; i++) {
            int x = getBestInt();
            Integer freq = mapI.get(x);
            mapI.put(x, freq == null ? 1 : freq + 1);
        }
        System.out.println("Most often picked ints, 0 - 19: " + mapI);
        
    }
}

结果显示:

Most often picked ints, 0 - 19: {9=10000}

Process finished with exit code 0

练习24:使用String“键”和你选择的对象填充LinkedHashMap。然后从中提取键值对,以键排序,然后重新插入此Map。

package testPackage3;

import java.util.*;

public class TestMapString {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("ten", 10);
        map.put("nine", 9);
        map.put("six", 6);
        map.put("eight", 8);
        map.put("seven", 7);
        map.put("five", 5);
        map.put("four", 4);
        map.put("first", 1);
        map.put("three", 3);
        map.put("second", 2);

        System.out.println("Map to sert:" + map);
        Map<String, Integer> map1 = new LinkedHashMap<>();
        Set<String> ss = new TreeSet<>(map.keySet());
        Iterator<String> it = ss.iterator();
        while (it.hasNext()) {
            String s = it.next();
            Integer i = map.get(s);
            map.remove(s);
            map1.put(s, i);
        }
        Set<String> map2 = new TreeSet<>(map1.keySet());
        Iterator<String> its = map2.iterator();
        while (its.hasNext()) {
            String s = its.next();
            Integer i = map1.get(s);
            map1.remove(s);
            map.put(s, i);
        }
        map1.clear();
        System.out.println("Sorted map:" + map);

    }
}

结果显示:

Map to sert:{ten=10, nine=9, six=6, eight=8, seven=7, five=5, four=4, first=1, three=3, second=2}
Sorted map:{eight=8, first=1, five=5, four=4, nine=9, second=2, seven=7, six=6, ten=10, three=3}

Process finished with exit code 0

练习25:创建一个Map<String,ArrayList<Integer>>,使用net.mindview.TextFile来打开一个文本文件,并一次读入一个单词。在读入单词时对它们进行计数,并且对于文件中的每一个单词,都在ArrayList<Integer>中记录下与这个词相关联的单词计数。实际上,它记录的是该单词在文件中被发现的位置。 

package testPackage3;

import net.mindview.util.TextFile;

import java.util.*;

public class TestMapInsert {
    public static void main(String[] args) {
        Map<String, ArrayList<Integer>> ma = new LinkedHashMap<>();
        List<String> words = new LinkedList<>();
        words.addAll(new TextFile("src/testPackage3/SetOperations.java", "\\W+"));
        System.out.println("Words in file:" + words);
        Iterator<String> it = words.iterator();
        int count = 0;
        while (it.hasNext()) {
            String s = it.next();
            count++;
            if (!ma.keySet().contains(s)) {
                ArrayList<Integer> al = new ArrayList<>();
                al.add(0, count);
                ma.put(s, al);
            } else {
                ma.get(s).add(count);
                ma.put(s, ma.get(s));
            } 
        }
        System.out.println("Map of word locations: " + ma);
    }
}

结果显示:

Words in file:[package, testPackage3, public, class, SetOperations]
Map of word locations: {package=[1], testPackage3=[2], public=[3], class=[4], SetOperations=[5]}

Process finished with exit code 0

练习26:拿到前一个练习中所产生的Map,并按照它们在最初的文件中出现的顺序重新创建单词顺序。

package testPackage3;

import net.mindview.util.TextFile;

import java.util.*;

public class TestMapInsert {
    

    public static void main(String[] args) {
        Map<String, ArrayList<Integer>> ma = new LinkedHashMap<>();
        List<String> words = new LinkedList<>();
        words.addAll(new TextFile("src/testPackage3/SetOperations.java", "\\W+"));
        System.out.println("Words in file:" + words);
        Iterator<String> it = words.iterator();
        int count = 0;
        while (it.hasNext()) {
            String s = it.next();
            count++;
            if (!ma.keySet().contains(s)) {
                ArrayList<Integer> al = new ArrayList<>();
                al.add(0, count);
                ma.put(s, al);
            } else {
                ma.get(s).add(count);
                ma.put(s, ma.get(s));
            } 
        }
        System.out.println("Map of word locations: " + ma);
        Map<Integer, String> replay = new TreeMap<>();
        Iterator<Map.Entry<String,ArrayList<Integer>>> ite = ma.entrySet().iterator();
        while (ite.hasNext()) {
            Map.Entry<String, ArrayList<Integer>> me = ite.next();
            for (int i = 0; i < me.getValue().size(); i++) {
                replay.put(me.getValue().get(i), me.getKey());
            }
            
        }
        System.out.println();
        System.out.println("TreeMap of ordered locations,words: " + replay);
        System.out.println("Words in original order:" + replay.values());
    }
    
}

结果显示:

Words in file:[package, testPackage3, public, class, SetOperations]
Map of word locations: {package=[1], testPackage3=[2], public=[3], class=[4], SetOperations=[5]}

TreeMap of ordered locations,words: {1=package, 2=testPackage3, 3=public, 4=class, 5=SetOperations}
Words in original order:[package, testPackage3, public, class, SetOperations]

Process finished with exit code 0

练习27:写一个称为Command的类,它包含一个String域和一个显示该String的operation()方法。写第二类,它具有一个使用Command对象来填充一个Queue并返回这个对象的方法。将填充后的Queue传递给第三个类的一个方法,该方法消耗掉Queue中的对象,并调用它们的operation()方法。

package testPackage3;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class Command {
    private String s;
    public void operation(){
        System.out.println(s);
    }

    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        b.removea(a.queue);
    }
    
}
class A{
    public Queue<Command> queue = new LinkedList<>(Arrays.asList(new Command(), new Command()));
}
class B{
    public void removea(Queue<Command> queue){
        for (Command com : queue) {
            com.operation();
            System.out.println(queue.remove());
        }
    }
}

 结果显示:

null
testPackage3.Command@677327b6

Process finished with exit code 0

练习28:用由java.util.Random创建的Double值填充一个PriorityQueue(用offer())方法,然后使用poll()移除并显示它们。

package testPackage3;

import java.util.PriorityQueue;
import java.util.Random;

public class Test28 {
    public static void main(String[] args) {
        PriorityQueue<Double> priorityQueue = new PriorityQueue<>();
        Random random = new Random(47);
        for (int i = 0; i < 10; i++) {
            priorityQueue.offer(random.nextDouble());
        }
        while (!priorityQueue.isEmpty()) {
            Double d = priorityQueue.poll();
            System.out.println(d);
        }
    }
}

结果显示:

0.0508673570556899
0.16020656493302599
0.18847866977771732
0.2613610344283964
0.2678662084200585
0.5166020801268457
0.5309454508634242
0.7271157860730044
0.7620665811558285
0.8037155449603999

Process finished with exit code 0

练习29:创建一个继承自Object的简单类,它不包含任何成员,展示你不能将这个类的多个示例成功地添加到一个PriorityQueue中。这个问题将在第17章中详细解释。

package testPackage3;

import java.util.PriorityQueue;

class A29 {

}

public class Test29 {
    public static void main(String[] args) {
        PriorityQueue<A29> priorityQueue = new PriorityQueue<>();
        for (int i = 0; i < 10; i++) {
            priorityQueue.offer(new A29());
        }
    }


}

结果显示:

Exception in thread "main" java.lang.ClassCastException: testPackage3.A29 cannot be cast to java.lang.Comparable
	at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:652)
	at java.util.PriorityQueue.siftUp(PriorityQueue.java:647)
	at java.util.PriorityQueue.offer(PriorityQueue.java:344)
	at testPackage3.Test29.main(Test29.java:12)

练习30:修改CollectionSequeuece.java,使其不要继承AbstractCollection,而是实现Collection。

package testPackage3;

import typeinfo.pets.Pet;
import typeinfo.pets.Pets;

import java.util.Collection;
import java.util.Iterator;

public class CollectionSequence implements Collection<Pet> {
    private Pet[] pets = Pets.createArray(8);

    public int size() {
        return pets.length;
    }

    @Override
    public boolean isEmpty() {
        return this.size() == 0;
    }

    @Override
    public boolean contains(Object o) {
        throw new UnsupportedOperationException();
    }

    public Iterator<Pet> iterator() {
        return new Iterator<Pet>() {
            private int index = 0;

            @Override
            public boolean hasNext() {
                return index < pets.length;
            }

            @Override
            public Pet next() {
                return pets[index++];
            }

            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

    @Override
    public Object[] toArray() {
        return pets;
    }

    @Override
    public <T> T[] toArray(T[] a) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean add(Pet pet) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean remove(Object o) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean addAll(Collection<? extends Pet> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void clear() {
        if (this.size() != 0) {
            for (Pet p : pets) {
                p = null;
            }
        }
    }

    public static void main(String[] args) {
        CollectionSequence c = new CollectionSequence();
        InterfaceVsIterator.display(c);
        InterfaceVsIterator.display(c.iterator());
    }
}

结果显示:

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 
0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 

Process finished with exit code 0

练习31:修改polymorphism/shape/RandomShapeGenerator.java,使其成为一个Iterable。你需要添加一个接受元素数量为参数的构造器,这个数量是指在停止之前,你想用迭代器生成的元素的数量。验证这个程序可以工作。

package testPackage3;

import java.util.Iterator;
import java.util.Random;

class Shape {
    public void draw() {

    }

    public void erase() {

    }

    public void amend() {
        System.out.println("Shape.amend()");
    }

    public String toString() {
        return "Shape";
    }
}

class Circle extends Shape {
    public void draw() {
        System.out.println("Circle.draw()");
    }

    public void erase() {
        System.out.println("Circle.erase()");
    }

    public void amend() {
        System.out.println("Circle.amend()");
    }

    public String toString() {
        return "Circle";
    }
}

class Square extends Shape {
    public void draw() {
        System.out.println("Square.draw()");
    }

    public void erase() {
        System.out.println("Square.erase()");
    }

    public void amend() {
        System.out.println("Square.amend()");
    }

    public String toString() {
        return "Square";
    }
}

class Triangle extends Shape {
    public void draw() {
        System.out.println("Triangle.draw()");
    }

    public void erase() {
        System.out.println("Triangle.erase()");
    }

    public void amend() {
        System.out.println("Triangle.amend()");
    }

    public String toString() {
        return "Triangle";
    }
}

public class RandomShapeGenerator implements Iterable<Shape> {
    private Random random = new Random(47);
    private Shape[] shapes;

    public RandomShapeGenerator(int n) {
        shapes = new Shape[n];
        for (int i = 0; i < n; i++) {
            shapes[i] = next();
        }
    }

    public Shape next() {
        switch (random.nextInt(3)) {
            default:
            case 0:
                return new Circle();
            case 1:
                return new Square();
            case 2:
                return new Triangle();
        }
    }

    @Override
    public Iterator<Shape> iterator() {
        return new Iterator<Shape>() {
            private int index = 0;

            @Override
            public boolean hasNext() {
                return index < shapes.length;
            }

            @Override
            public Shape next() {
                return shapes[index++];
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

    public static void main(String[] args) {
        RandomShapeGenerator rsg = new RandomShapeGenerator(20);
        for (Shape s : rsg) {
            System.out.println(s);
        }
    }
}

结果显示:
 

Triangle
Triangle
Square
Triangle
Square
Triangle
Square
Triangle
Circle
Square
Circle
Circle
Circle
Square
Triangle
Square
Square
Square
Triangle
Square

Process finished with exit code 0

练习32:按照MultiIterableClass示例,在NonCollectionSequence.java中添加reversed()和randomized()方法,并让NonCollectionSequence实现Iterable。然后在foreach语句中展示所有的使用方式。        

package testPackage3;

import typeinfo.pets.Pet;
import typeinfo.pets.Pets;

import java.util.*;

class PetSequence {
    protected Pet[] pets = Pets.createArray(8);
}

public class NonCollectionSequence extends PetSequence {
    public Iterator<Pet> iterator() {
        return new Iterator<Pet>() {
            private int index = 0;

            @Override
            public boolean hasNext() {
                return index < pets.length;
            }

            @Override
            public Pet next() {
                return pets[index++];
            }

            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

    public Iterable<Pet> reversed() {
        return new Iterable<Pet>() {
            @Override
            public Iterator<Pet> iterator() {
                return new Iterator<Pet>() {
                    int current = pets.length - 1;

                    @Override
                    public boolean hasNext() {
                        return current > -1;
                    }

                    @Override
                    public Pet next() {
                        return pets[current--];
                    }
                };
            }
        };
    }

    public Iterable<Pet> randomized() {
        return new Iterable<Pet>() {
            @Override
            public Iterator<Pet> iterator() {
                List<Pet> shuffled = new ArrayList<>(Arrays.asList(pets));
                Collections.shuffle(shuffled, new Random());
                return shuffled.iterator();
            }
        };
    }

    public static void main(String[] args) {
        NonCollectionSequence nc = new NonCollectionSequence();
        System.out.print("pets:");
        for (Pet p : nc.pets) {
            System.out.print(p + " ");
        }
        System.out.println();
        System.out.print("reversed:");
        for (Pet p : nc.reversed()) {
            System.out.print(p + " ");
        }
        System.out.println();
        System.out.print("randomized:");
        for (Pet p : nc.randomized()) {
            System.out.print(p + " ");
        }
    }
}

结果显示:

pets:Rat Manx Cymric Mutt Pug Cymric Pug Manx 
reversed:Manx Pug Cymric Pug Mutt Cymric Manx Rat 
randomized:Cymric Pug Rat Manx Cymric Pug Mutt Manx 
Process finished with exit code 0

 望大佬们指点!