Java编程思想第四版第十一章习题(中)

编译器:IDEA

(下)的时候可能会有个小总结

题目5-26

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

package job;
import java.util.*;
public class Main {
    public static List<Integer> change(int length, int n) {
        Random rand = new Random();
        List<Integer> a = new ArrayList<>();
        for (int i = 0; i < length; i++)
            a.add(rand.nextInt(n));
        return a;
    }

    public static void main(String[] args) {
        Random rand = new Random();
        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));
        //removes the first instance equivalent to Integer b:
        a.remove(b);
        System.out.println("3.5 " + a);
        Integer p = a.get(2);
        System.out.println("4: " + p + " " + a.indexOf(p));
        Integer c = rand.nextInt(10);
        System.out.println("5: " + c + " " + 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> d = a.subList(1, 4);
        System.out.println("sublist: " + d);
        System.out.println("10: " + a.containsAll(d));
        Collections.sort(d);
        System.out.println("sorted sublist: " + d);
        System.out.println("11: " + a.containsAll(d));
        System.out.println("11.25: " + a);
        Collections.shuffle(d, rand);
        System.out.println("11.5: " + a);
        System.out.println("shuffled sublist: " + d);
        System.out.println("12: " + a.containsAll(d));
        List<Integer> e = new ArrayList<Integer>(a);
        System.out.println("12.5 " + a);
        d = Arrays.asList(a.get(1), a.get(4));
        System.out.println("d: " + d);
        e.retainAll(d);
        System.out.println("13: " + e);
        e = new ArrayList<Integer>(a);
        e.remove(2);
        System.out.println("14: " + e);
        e.removeAll(d);
        System.out.println("15: " + e);
        if (e.size() > 1)
            e.set(1, 8);
        System.out.println("16: " + e);
        if (e.size() > 2)
            e.addAll(2, d);
        System.out.println("17: " + e);
        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]);
    }
}

 

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

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

 同上。

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

package job;
import java.util.*;
class A{

}
public class Main {
    static List<A> a=new LinkedList<>();
    public static void main(String[] args) {
        a.add(new A());
        System.out.println(a);
        a.remove(0);
        System.out.println(a);
    }
}

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


package job;

import java.util.*;

class Gerbil{

    int getbilNumber;

    Gerbil(int x){

        getbilNumber=x;

    }

    void hop(){

        System.out.print(getbilNumber);

        System.out.println(" jumping");

    }

}

public class Main{

    public static void main(String[] args){

        ArrayList<Gerbil> a= new ArrayList<>();

        a.add(new Gerbil(5));

        a.add(new Gerbil(8));

        a.add(new Gerbil(10));
        Iterator<Gerbil> b=a.iterator();

        while (b.hasNext()){
            Gerbil c=b.next();
            c.hop();
        }

    }

}

 

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

package job;
import java.util.*;
interface Selector {
    boolean end();
    Object current();
    void next();
}
public class Main {

    private ArrayList<Object> items = new ArrayList<Object>();

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

    private class Sequence3Selector 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 static void main(String[] args) {
        List<Integer> a = new LinkedList<>();
        for (int i = 0; i < 10; i++)
            a.add(i);
        Iterator<Integer> b = a.iterator();
        while (b.hasNext()) {
            Integer c = b.next();
            System.out.print(c + " ");
        }
        System.out.println();
        a.add(05);
        a.add(16);
        a.add(27);
        a.add(38);
        a.add(38);
        b = a.iterator();
        while (b.hasNext()) {
            Integer c = b.next();
            System.out.print(c + " ");
        }
    }
}

 

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

package job;
import java.awt.*;
import java.util.*;
class Rodent{
    void bit(){};
}
class Mouse extends Rodent{
    @Override
    void bit(){
        System.out.println("Mouse bit");
    }
}
class Gerbil extends Rodent{
    @Override
    void bit(){
        System.out.println("Gerbil bit");
    }
}
class Hamster extends Rodent{
    @Override
    void bit(){
        System.out.println("Hamster bit");
    }
}
public class Main {
    public static void main(String[] args) {
        ArrayList<Rodent> a=new ArrayList<>();
        a.add(new Mouse());
        a.add(new Hamster());
        a.add(new Gerbil());
        Iterator<Rodent>b=a.iterator();
        while (b.hasNext()){
            Rodent c=b.next();
            c.bit();
        }
    }
}

 

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

package job;
import java.util.*;
public class Main {
    public static void display(Collection c) {
        Iterator it = c.iterator();
        while (it.hasNext())
            System.out.print(it.next() + " ");
        System.out.println();
    }

    public static void main(String[] args) {
        List<Integer> a = new ArrayList<>(
                Arrays.asList(1, 2, 3)
        );
        display(a);
    }
}

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

package job;
import java.util.*;
public class Main {
    static List<Integer>a=new ArrayList<>(
            Arrays.asList(1,2,3)
    );
    static List<Integer>b=new ArrayList<>(
            Arrays.asList(4,5,6)
    );
    public static void main(String[] args) {
        ListIterator<Integer>c=a.listIterator(a.size());
        ListIterator<Integer>d=b.listIterator(b.size());
        while (c.hasPrevious()){
            Integer e=c.previous();
            d.add(e);
        }
        for (Integer p:b){
            System.out.print(p+" ");
        }
    }
}

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

找不到源代码,略。

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

package job;
import java.lang.reflect.Array;
import java.util.*;
public class Main {
    public static void main(String[] args) {
       LinkedList<Integer> a=new LinkedList<>(
               Arrays.asList(1,2,3,4)
       );
       ListIterator<Integer>b=a.listIterator();
       a.add(2,5);
       a.add(2,8);
       for(Integer c:a){
           System.out.print(c);
       }
    }
}

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

package job;
import java.lang.reflect.Array;
import java.util.*;
class Stack<T>{
    private LinkedList<T>storage=new LinkedList<T>();
    public void push(T v){
        storage.addFirst(v);
    }
    public T peek(){
        return storage.getFirst();
    }
    public T pop(){
        return storage.removeFirst();
    }
    public boolean empty(){
        return storage.isEmpty();
    }
    public String toString(){
        return storage.toString();
    }
}
public class Main {
    public static void main(String[] args) {
        Stack<Character> a = new Stack<>();
        String s = "+U+n+c---+e+r+t---+a-+i-+n+t+y---+-+r+u--+l+e+s---";
        char p[] = s.toCharArray();
        for (int i = 0; i < p.length; ) {
            switch (p[i++]) {
                case '+':
                    a.push(p[i++]);
                    break;
                case '-':
                    System.out.println(a.pop());
                    break;
            }
        }
    }
}

 

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

由于还没学习读写,我只把函数写出来:

static void getnum(Set<String> b) {
        Set<Character> a = new TreeSet<Character>();
        Collections.addAll(a, 'A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u');
        int num = 0;
        for (String s : b) {
            int count = 0;
            for (Character v : s.toCharArray()) {
                if (a.contains(v)) {
                    count++;
                    num++;
                }
            }
            System.out.print(s + ": " + count + ", ");
        }
        System.out.println();
        System.out.print("Total a: " + num);
    }

 

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


package job;

import java.lang.reflect.Array;
import java.util.*;

class Gerbil{

    int getbilNumber;

    Gerbil(int x){

        getbilNumber=x;

    }

    void hop(){
        System.out.println(getbilNumber);

        System.out.println("jumping");

    }

}

public class Main {
    static Map<String, Gerbil> a = new HashMap<>();

    static {
        a.put("FirstPeople", new Gerbil(2));
        a.put("SeconPeople", new Gerbil(5));
    }

    static Iterator<String> b = a.keySet().iterator();

    public static void main(String[] args) {
        for (String s : a.keySet()) {
            String c = b.next();
            System.out.print(s + " ");
            a.get(c).hop();
        }

    }
}

 

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


package job;

import java.lang.reflect.Array;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Map<Integer, Integer> a = new HashMap<>();
        a.put(9, 2);
        a.put(5, 6);
        a.put(4,2);
        SortedMap<Integer, Integer> b = new TreeMap<>(a);
        LinkedHashMap<Integer, Integer> c = new LinkedHashMap<>(b);
        for (Integer e : c.keySet()) {
            System.out.println(e+" "+" "+c.get(e));
        }
    }
}

 

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


package job;

import java.lang.reflect.Array;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Set<Integer> a = new HashSet<>();
        a.add(9);
        a.add(5);
        a.add(4);
        SortedSet<Integer> b = new TreeSet<>(a);
        HashSet<Integer> c = new HashSet<>(b);
        for (Integer e : c) {
            System.out.println(e);
        }
    }
}

package job;

import java.lang.reflect.Array;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Set<Integer> a = new LinkedHashSet<>();
        a.add(9);
        a.add(5);
        a.add(4);
        SortedSet<Integer> b = new TreeSet<>(a);
        LinkedHashSet<Integer> c = new LinkedHashSet<>(b);
        for (Integer e : c) {
            System.out.println(e);
        }
    }
}

 

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

还没学习,略。

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

还没学习,略。

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

还没学习,略。

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

package job;
import java.util.*;
import java.util.Map.Entry;

public class Main {
    public static void main(String[] args) {
        Map<Integer, Integer> numsMap = new HashMap<>();
        Random random = new Random();
        for (int i = 0; i < 10000; i++) {
            Integer key = random.nextInt(30);
            Integer vlue = numsMap.get(key);
            numsMap.put(key, vlue == null ? 1 : vlue + 1);

        }
        List<Entry<Integer, Integer>> a = new ArrayList<Entry<Integer, Integer>>(numsMap.entrySet());
        Collections.sort(a, new Comparator<Entry<Integer, Integer>>() {


            @Override
            public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
                // TODO Auto-generated method stub
                return o2.getValue() - o1.getValue();
            }
        });
        ;

        for (Entry<Integer, Integer> entry : a) {
            System.out.format("%02d -------------%03d\n", entry.getKey(), entry.getValue());
        }


    }
}

 

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

package job;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Main {
    static LinkedHashMap<String, Integer> a = new LinkedHashMap<>();
    static {
        a.put("Three", 3);
        a.put("Eight", 8);
        a.put("Nine", 9);
        a.put("ten", 10);
        a.put("one", 1);
    }
    public static void main(String[] args) {
        System.out.println(a);
        List<Map.Entry<String, Integer>> b = new ArrayList<Map.Entry<String,Integer>>(a.entrySet());
        Collections.sort(b, new Comparator<Map.Entry<String, Integer>>() {
            public int compare(Entry<String, Integer> c,Entry<String, Integer> d) {
                return c.getKey().compareTo(d.getKey());
            }
        });
        a.clear();
        for(Map.Entry<String, Integer> c:b) {
            a.put(c.getKey(), c.getValue());
        }
        System.out.println(a);
    }
}

 

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

还没学习,略。

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

还没学习,略。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值