练习1:
// arrays/Ex1.java
// TIJ4 Chapter Arrays, Exercise 1, page 752
/* Create a method that takes an array of Pet as an argument.
* Call the method, creating the argument dynamically. Demonstrate that
* ordinary aggregate array intitialization doesn't work in this case.
* Discover the only situations where ordinary aggregate array initialization
* works, and where dynamic aggregate array initialization is redundant.
*/
import java.util.*;
import static net.mindview.util.Print.*;
import typeinfo.pets.*;
class A { public String toString() { return "A Object"; } }
public class Ja16_1 {
// Method that takes Pet[] as argument
// and prints the argument as array elements and as List or String:
public static void test(Pet[] a) {
print(Arrays.asList(a));
}
// Generic version:
public static void test(T[] t) {
print(Arrays.asList(t));
}
// int version:
public static void test(int[] ia) {
print(Arrays.toString(ia));
}
public static void main(String[] args) {
print("For objects, e.g., Pets:");
// Array is created and initialized (aggregate initialization)
// but all elements are null, not Pets:
test(new Pet[3]);
// Dynamic aggregate initialization works;
// elements are now Pets:
test(new Pet[]{
new Pet(), new Pet() });
// Aggregate initialization this way works:
Pet[] a = { new Pet(),
new Pet(), new Pet() };
test(a);
// Elements initialized to null:
Pet[] bsa = new Pet[2];
test(bsa);
bsa = a;
test(bsa);
print("-------------");
print("For primitives, e.g., int:");
// Dynamic aggregate initialization works:
test(new int[]{ new Integer(0), new Integer(0) });
// But may be considered redundant, since
// aggregate initialization works:
// elements initialized to zero (not null):
test(new int[2]);
// Ordinary aggregate initialization this way also works:
int[] ia = { 1, 2, 3, };
test(ia);
}
}
练习2:
// Write a method that takes an int argument and returns an
// array of that size filled BerylliumSpheres.
import typeinfo.pets.*;
import java.util.*;
import static net.mindview.util.Print.*;
class A{
private static final Pet[] pp={new Dog(),new Cat(),new Pug()};
static Pet[] p(int i){
boolean[] b=new boolean[i];
Pet[] pet=new Pet[i];
Random rand=new Random(22);
int t=0;
for(int j=0;j
练习3:
/* Write a method that creates and initializes a two-dimensional array of double.
* The size of the array is determined by the * arguments of the method, and the
* initialization values are a range determined by beginning and ending values
* that are also arguments of the method. Create a second method that will print
* the array generated by the first method. In main() test the methods by
* creating and printing several different sizes of arrays.
*/
import static net.mindview.util.Print.*;
import java.util.*;
class A{
double[][] f(int size1,int size2,double start, double end){
double[][] d=new double[size1][size2];
for(int i=0;i
练习4:
// Repeat the previous exercise for a three-dimensional array.
import static net.mindview.util.Print.*;
import java.util.*;
class A{
double[][] f(int size1,int size2,double start, double end){
double[][] d=new double[size1][size2];
for(int i=0;i
练习5:
// Demonstrate that multidimensional arrays of non-primitives are
// automatically initialized to null.
import static net.mindview.util.Print.*;
import java.util.*;
class A{
double[][] f(int size1,int size2,double start, double end){
double[][] d=new double[size1][size2];
return d;
}
void g(int size1,int size2,double start, double end){print(Arrays.deepToString(f(size1,size2,start,end)));}
}
public class Ja16_5{
public static void main(String[] args) {
A a=new A();
a.g(2,4,3,19);
}
}
练习6:
练习7:
练习8:
// Demonstrate the assertions in the previous paragraph.
import static net.mindview.util.Print.*;
public class Ja16_8{
public static void main(String[] args){
Object[] o=new Object[]{new String("fsd"),new Integer(23)};
print(o[0].getClass());
print(o[1].getClass());
}
}
练习9:
练习10:
练习11:
// Show that autoboxing doesn't work with arrays.
import java.util.*;
import static net.mindview.util.Print.*;
public class Ja16_11{
public static void main(String[] args){
Integer[] a=new Integer[]{1,2,4,6};
print(Arrays.toString(a));
//int[] b=a;
}
}
练习12:
// Create an initialized array of double using CountingGenerator.
// Print the results.
import net.mindview.util.*;
import static net.mindview.util.Print.*;
import java.util.*;
public class Ja16_12{
public static void main(String[] args){
print(Arrays.toString(Generated.array(Double.class,new CountingGenerator.Double(),5)));
}
}
练习13:
// Fill a String using CountingGenerator.Character.
import net.mindview.util.*;
import static net.mindview.util.Print.*;
import java.util.*;
public class Ja16_13{
public static void main(String[] args){
Character[] ca=Generated.array(Character.class,new CountingGenerator.Character(),5);
char[] caa=ConvertTo.primitive(ca);
String a=new String(caa);
print(a);
}
}
练习14:
// Create an array of each primitive type, then fill each array by using
// CountingGenerator. Print each array.
import net.mindview.util.*;
import static net.mindview.util.Print.*;
import java.util.*;
public class Ja16_14{
public static void main(String[] args){
CountingGenerator.Double cd=new CountingGenerator.Double();
Double[] d=new Double[5];
for(int i=0;i
练习15:
// Modify ContainerComparison.java by creating a net.mindview.util.Generator for
// BerylliumSphere, and change main() to use that net.mindview.util.Generator
// with Generated.array().
import java.util.*;
import static net.mindview.util.Print.*;
import net.mindview.util.*;
//interface net.mindview.util.Generator { T next(); } ///:~
/*class Generated {
// Fill an existing array:
public static T[] array(T[] a, net.mindview.util.Generator gen) {
return new CollectionData(gen, a.length).toArray(a);
}
// Create a new array:
@SuppressWarnings("unchecked")
public static T[] array(Class type,
net.mindview.util.Generator gen, int size) {
T[] a =
(T[])java.lang.reflect.Array.newInstance(type, size);
return new CollectionData(gen, size).toArray(a);
}
}*/
class BerylliumSphere {
private static long counter;
private final long id = counter++;
public String toString() { return "Sphere " + id; }
static class generator implements net.mindview.util.Generator{
public BerylliumSphere next(){
return new BerylliumSphere();
}
}
}
public class Ja16_15 {
public static void main(String[] args) {
print(Arrays.toString(Generated.array(BerylliumSphere.class,new BerylliumSphere.generator(),5)));
}
}
//Generator需要用全限定名net.mindview.util.Generator
PS:Generator需要用全限定名net.mindview.util.Generator
练习16:
/* Starting with CountingGenerator.java, create a SkipGenerator class
* that produces new values by incrementing according to a constructor
* argument. Modify TestArrayGeneration.java to show that your new
* class works correctly.
*/
import java.util.*;
import static net.mindview.util.Print.*;
import net.mindview.util.*;
class CountingGenerator{
public static class
Boolean implements Generator {
private boolean value = false;
public java.lang.Boolean next() {
value = !value; // Just flips back and forth
return value;
}
public java.lang.Boolean next(int n) {
value = !value; // Just flips back and forth
return value;
}
}
public static class
Byte implements Generator {
private byte value = 0;
public java.lang.Byte next() { return value++; }
public java.lang.Byte next(int n) { return value+=n; }
}
static char[] chars = ("abcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
public static class
Character implements Generator {
int index = -1;
public java.lang.Character next() {
index = (index + 1) % chars.length;
return chars[index];
}
public java.lang.Character next(int n) {
index = (index + n) % chars.length;
return chars[index];
}
}
public static class
String implements Generator {
private int length = 7;
Generator cg = new Character();
public String() {}
public String(int length) { this.length = length; }
public java.lang.String next() {
char[] buf = new char[length];
for(int i = 0; i < length; i++)
buf[i] = cg.next();
return new java.lang.String(buf);
}
/*public java.lang.String next(int n) {
char[] buf = new char[length];
for(int i = 0; i < length; i++)
buf[i] = cg.next(n);
return new java.lang.String(buf);
}*/
}
public static class
Short implements Generator {
private short value = 0;
public java.lang.Short next() { return value++; }
public java.lang.Short next(int n) { return value+=n; }
}
public static class
Integer implements Generator {
private int value = 0;
public java.lang.Integer next() { return value++; }
public java.lang.Integer next(int n) { return value+=n; }
}
public static class
Long implements Generator {
private long value = 0;
public java.lang.Long next() { return value++; }
public java.lang.Long next(int n) { return value+=n; }
}
public static class
Float implements Generator {
private float value = 0;
public java.lang.Float next() {
float result = value;
value += 1.0;
return result;
}
public java.lang.Float next(float n) {
float result = value;
value += n;
return result;
}
}
public static class
Double implements Generator {
private double value = 0.0;
public java.lang.Double next() {
double result = value;
value += 1.0;
return result;
}
public java.lang.Double next(double n) {
double result = value;
value += n;
return result;
}
}
} ///:~
public class Ja16_16{
public static void main(String[] args){
CountingGenerator.Double cd=new CountingGenerator.Double();
print(cd.next((double)5.0));
print(cd.next((double)5.0));
}
}
练习17:
// Create and test a Generator for BigDecimal, and ensure
// that it works with the Generated methods.
import java.util.*;
import static net.mindview.util.Print.*;
import net.mindview.util.*;
import java.math.*;
class BigDecimalGenerator implements net.mindview.util.Generator{
private BigDecimal bd=new BigDecimal(0.0);
public BigDecimal next(){
return bd=bd.add(new BigDecimal(1.0));
}
}
public class Ja16_17{
public static void main(String[] args){
print(Arrays.toString(Generated.array(BigDecimal.class,new BigDecimalGenerator(),4)));
}
}
练习18:
// Create and fill and array of BerylliumSphere. Copy this array
// to a new array and show that it's a shallow copy.
import java.util.*;
import typeinfo.pets.*;
import static net.mindview.util.Print.*;
public class Ja16_18{
public static void main(String[] args) {
Pet[] p=new Pet[]{new Cat(),new Dog(),new Pug()};
Pet[] m=new Pet[]{new Pet(),new Pet(),new Pet()};
System.arraycopy(p,0,m,0,p.length);
print(Arrays.toString(p));
print(Arrays.toString(m));
}
}
练习19:
/* Create a class with an int field that's initialized from a constructor
* argument. Create two arrays of these objects, using identical
* intitialization values for each array, and show that Arrays.equals() says
* that they are unequal. Add an equals() method to your class to fix the
* problem.
*/
import java.util.*;
import static net.mindview.util.Print.*;
class A{
public int n;
A(int n){this.n=n;}
public boolean equals(Object b){
if(b.getClass().getSimpleName()=="A")return (((A)b).n==this.n) ;
return false;
}
}
public class Ja16_19{
public static void main(String[] args){
A[] a={new A(1)};
A[] b={new A(1)};
print(Arrays.equals(a,b));
}
}
练习20:
// Demonstrate deepEquals() for multidimensional arrays.
import java.util.*;
import static net.mindview.util.Print.*;
public class Ja16_20{
public static void main(String[] args){
int[][][] a={{{2,3},{5,7}},{{3,7,9},{7,9,2},{5}}};
int[][][] b={{{2,3},{5,7}},{{3,7,9},{7,9,2},{5}}};
print(Arrays.deepEquals(a,b));
}
}
练习21:
// Try to sort an array of the objects in Exercise 18. Implement
// Comparable to fix the problem. Now create a Comparator to sort
import java.util.*;
import typeinfo.pets.*;
import static net.mindview.util.Print.*;
class CompBerylliumSphere
implements Comparable {
private static long count;
protected final long id = count++;
public int compareTo(CompBerylliumSphere c2) {
return (this.id < c2.id ? -1 : (this.id == c2.id ? 0 : 1));
}
public String toString() {
return "BerylliumSphere " + id;
}
}
class AComparator implements Comparator{
public int compare(CompBerylliumSphere c1, CompBerylliumSphere c2){
return (c2.id
练习22:
// Show that the results of performing a binarySearch() on an
// unsorted array are unpredictable.
import java.util.*;
import typeinfo.pets.*;
import static net.mindview.util.Print.*;
class CompBerylliumSphere
implements Comparable {
private static long count;
protected final long id = count++;
public int compareTo(CompBerylliumSphere c2) {
return (this.id < c2.id ? -1 : (this.id == c2.id ? 0 : 1));
}
public String toString() {
return "BerylliumSphere " + id;
}
}
class AComparator implements Comparator{
public int compare(CompBerylliumSphere c1, CompBerylliumSphere c2){
return (c2.id
练习23:
// Create an array of Integer fill it with random int values (using
// autoboxing), and sort it into reverse order using a Comparator.
import net.mindview.util.*;
import java.util.*;
import static net.mindview.util.Print.*;
public class Ja16_23{
public static void main(String[] args) {
Integer[] ig=new Integer[5];
Generated.array(ig,new RandomGenerator.Integer());
Arrays.sort(ig,Collections.reverseOrder());
print(Arrays.toString(ig));
}
}
练习24:
// Show that the class from Exercise 19 can be searched.
import java.util.*;
import static net.mindview.util.Print.*;
class A implements Comparable{
public int n;
A(int n){this.n=n;}
public boolean equals(Object b){
if(b.getClass().getSimpleName()=="A")return (((A)b).n==this.n) ;
return false;
}
public int compareTo(A rv){
return (this.n
练习25:
// Rewrite PythonLists.py in Java.
import java.util.*;
import static net.mindview.util.Print.*;
class Mylist{
List ls=new ArrayList();
Mylist(List ls){
this.ls=ls;
}
List rls=new ArrayList();
List getReversed(){
ListIterator lit=ls.listIterator(ls.size());
while(lit.hasPrevious()){
rls.add((Integer)lit.previous());
}
return rls;
}
}
public class Ja16_25{
public static void main(String[] args){
List ls=new ArrayList(Arrays.asList(1,3,5,7,3));
Mylist ml=new Mylist(ls);
print(ml.getReversed());
}
}