class TestSP // System Properties
{
public static void main(String[] args) {
Properties p = System.getProperties(); // 第六行
Enumeration e = p.propertyNames(); // 第七行
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
if (name.equals("aaa")) {
String value = p.getProperty(name);
System.out.println("name: " + name + " value: " + value);
}
}
}
}
分析:第六行取得系统属性的集合,第七行从属性集合中得到属性名的枚举。枚举对象允许程序循环遍历其中的所有元素。这一点与迭代相似。hasMoreElements 方法判断枚举中是否还有后续元素,nextElement方法返回枚举中的下一个元素。
运行:
java -Daaa=345 TestSP //-D后面是属性的名字,=后面是属性的值 ,注意是大写的D
输出结果摘录如下:
class TestKI // Keyboard Input
{
public static void main(String[] args) {
String s;
// 进行字符串的包装,就可以读取一行字符串
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.println("按 ctrl+c 键 或者输入exit 退出程序!");
try {
s = br.readLine();
// 如果按 ctrl+c 键,那么s==null,所以要先进行s!=null判断,不然
// 会出现空指针异常(调用s.equals("exit"))
while (s != null && !s.equals("exit")) {
System.out.println("Read: " + s);
s = br.readLine();
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
编译和运行的结果为:
JDK1.5新特性:java.util.Scanner类,如下代码:
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的名字:");
String name = scanner.nextLine();
System.out.print("请输入你的年龄:");
int age = scanner.nextInt();
System.out.println(name + "年龄是:" + age);
}
}
JDK1.6新特性:java.io.Console类,如下代码:
import java.io.Console;
public class ConsoleDemo {
public static void main(String[] args) {
Console console = System.console();
System.out.print("请输入你的名字:");
String name = console.readLine();
System.out.print("请输入你的密码:");
char[] password = console.readPassword();
System.out.println(name + "密码是:" + new String(password));
}
}
public class TestList2 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("one");
list.add("second");
list.add("third");
list.add(new Integer(4));
list.add(new Float(5.0F));
list.add("second"); // true
list.add(new Integer(4)); // true
// 使用迭代器,来迭代容器里的所以数据,我们把Iterator叫做迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
输出结果为:
one
second
third
4
5.0
second
4
上面例子只用了Iterator,这种迭代器只能向后迭代容器里的数据,有时候需要向前迭代数据,那么就得用ListIterator(列表迭代器),它可以前后滚动容器里的数据。请看下面的例子:
import java.util.*;
public class TestList3 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("one");
list.add("second");
list.add("third");
list.add(new Integer(4));
list.add(new Float(5.0F));
list.add("second"); // true
list.add(new Integer(4)); // true
ListIterator iterator = list.listIterator();
System.out.println("向下迭代容器里的数据:");
while (iterator.hasNext())
System.out.println(iterator.next());
System.out.println("向上迭代容器里的数据:");
while (iterator.hasPrevious())
System.out.println(iterator.previous());
}
}
输出结果为:
向下迭代容器里的数据:
one
second
third
4
5.0
second
4
向上迭代容器里的数据:
4
second
5.0
4
third
second
one
用迭代器还可以修改容器里的数据,只不过只能用当前的迭代器修改,不能两个迭代器同时修改一个容器里的数据!
请看下面事例:
import java.util.*;
public class TestList4 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("one");
list.add("second");
list.add("third");
list.add(new Integer(4));
list.add(new Float(5.0F));
list.add("second"); //true
list.add(new Integer(4)); //true
ListIterator listIterator = list.listIterator();
Iterator iterator = null;
iterator = list.iterator();
if (iterator.hasNext())
iterator.next();
iterator.remove();//会删除该next()返回的元素。
//用另个迭代器操作上一个迭代器改变后的数据
while (listIterator.hasNext())
System.out.println(listIterator.next());
public class TestMap {
public static void main(String[] args) {
Map map = new HashMap();
map.put("abc", new Integer(5));
map.put("abd", new Integer(6));
map.put("abf", new Integer(7));
// 会覆盖原来的值7
map.put("abf", new Integer(8));
System.out.println(map.get("abf"));
}
}
编译和运行的结果为:
8
在应用中可以把该容器里关键字单独取出来放到一个实现Set接口的容器里,然后过滤出你所需要的关键字,然后根据这个关键字把对应的值取出来。
import java.util.Map;
import java.util.*;
public class TestMap1 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("abc", new Integer(5));
map.put("abd", new Integer(6));
map.put("abf", new Integer(7));
map.put("abf", new Integer(8));
// 得到关键字的集合
Set s = map.keySet();
Iterator i = s.iterator();
String str = null;
while (i.hasNext()) {
str = (String) i.next();
if (str.equals("abf"))
System.out.println(map.get(str));
}
}
}
结果还是8
注意:这里的关键字对象还是由hashCode()和equals()方法共同决定的
例11
排序
问题的描述:
排序的用法
解决方案:
对于复杂的应用,尤其是生成报表时,排序是一种必不可少的基本操作。在Java 2 Collections API中,已经实现了几种排序。
给数组排序可以使用Arrays对象的一套sort方法。
对于boolean以外的基本类型,Arrays.sort有两种变化:
Arrays.sort(<type>[] array)用来为整个数组排序。
Arrays.sort(<type>[] array, int fromIndex, int toIndex)用来为数组的一部分排序。
对于引用类型,Arrays.sort有四种种变化:
Arrays.sort(Object[] array)用默认的比较器为整个数组排序。
Arrays.sort(Object[] array, int fromIndex, int toIndex)用默认的比较器为数组的一部分排序。
Arrays.sort(Object[] array, Comparator comparator)使用指定得比较器为整个数组排序。
Arrays.sort(Object[] array, int fromIndex, int toIndex, Comparator comparator)使用指定得比较器为数组的一部分排序。
由于排序算法必须比较两个对象,所以使用Arrays.sort方法时要传递比较器参数。比较器有两种类型:一种是实现Comparable接口的, 另一种是实现Comparator接口的。
Comparable接口定义了一个方法:int compareTo(element, Object)。这个方法比较 Object 与element。如果Object小于element,则返回负值;如果Object大于element,则返回正值;如果Object等于element,则返回零。
Comparator接口定义了两个方法:
compare(T o1, T o2) ,返回值int。如果o1小于o2,则返回负值;如果o1大于o2,则返回正值;如果o1等于o2,则返回零。
equals(Object obj) ,返回值boolean。用于判断两个比较器对象是否相等。该方法在继承Object类时已经被实现。
请看下例:
import java.util.*;
public class TestCompareable1 {
public static void main(String[] args) {
Cat[] c = new Cat[5];
for (int i = 0; i < c.length; i++) {
c[i] = new Cat((int) (Math.random() * 100));
// 随机生成一个整数,作为猫对象的属性值,以区分不同的对象
System.out.println(c[i]);
}
Arrays.sort(c);
System.out.println("----------------");
for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);
}
}
}
class Cat implements Comparable {
int w = 0;
public Cat(int i) {
w = i;
}
public String toString() {
return "Cat: " + w;
}
public int compareTo(Object o) {
Cat c = (Cat) o;
if (this.w == c.w) // 相等的话返回0
{
return 0;
} else if (this.w > c.w) // 大于的话返回正数
{
return 6;
} else
return -3; // 小于的话返回负数
}
}
输出结果如图
也可以定义动态的比较器,如下事例:
import java.util.*;
public class TestCompareable2 {
public static void main(String[] args) {
Cat[] c = new Cat[5];
for (int i = 0; i < c.length; i++) {
c[i] = new Cat((int) (Math.random() * 100));
// 随机生成一个整数,作为猫对象的属性值,以区分不同的对象
System.out.println(c[i]);
}
Arrays.sort(c, new Comparator() // 匿名类实现
{
public int compare(Object o1, Object o2) {
Cat c1 = (Cat) o1;
Cat c2 = (Cat) o2;
if (c1.w > c2.w) // 如果大于的话返回正数
return 4;
else if (c1.w < c2.w)
return -2; // 小于的话返回负数
else
return 0; // 相等的话返回0