Java Tutorial 第二堂(2)容器與流程語法
|
Java Tutorial 第二堂(1)數值與字串型態 << 前情 想想你平時撰寫的一些應用程式,大部份是在處理一組資料,Java 對管理資料用的容器(Container)型態,在語法上提供直接支援的只有陣列,其餘則是以程式庫的形式存在,除了標準程式庫之外,還有各式開放原始碼程式庫可供選擇。 在這邊將會介紹 Java 中的陣列、 陣列型態Java 目前唯一在語法上提供支援的是陣列,如果你需要容量固定且有序的容器,就可以使用陣列。例如 在 Java 中陣列是物件,雖然如此,基本上與陣列有關的屬性只有 List 型態如果需要有序具索引特性的容器,且需要比陣列擁有更多功能,可以使用 List<Integer> numbers = Arrays.asList(1, 2, 3); 如果事先不知道要收集哪些元素,可以直接建立 List<Integer> numbers = Arrays.asList(1, 2, 3); List<Integer> collector = new ArrayList<>(); collector.add(10); collector.addAll(numbers); collector.size(); // 4 在上面的範例中,由於宣告 Set 型態
import java.util.*;
import static java.lang.System.out;
public class Main {
public static void main(String[] args) {
Set<String> admins = new HashSet<>(Arrays.asList("Justin", "caterpillar"));
Set<String> users = new HashSet<>(Arrays.asList("momor", "hamini", "Justin"));
out.println(admins.contains("Justin")); // 是否在站長群?true
Set<String> intersection = new HashSet<>(admins);
intersection.retainAll(users); // 同時是站長群也是使用者群的?
out.println(intersection); // [Justin]
Set<String> union = new HashSet<>(admins);
union.addAll(users); // 是站長群或是使用者群的?
out.println(union); // [momor, hamini, Justin, caterpillar]
Set<String> adminsButNotUsers = new HashSet<>(admins);
adminsButNotUsers.removeAll(users); // 站長群但不使用者群的?
out.println(adminsButNotUsers); // [caterpillar]
Set<String> xor = new HashSet<>(union);
xor.removeAll(intersection); // xor
out.println(xor); // [momor, hamini, caterpillar]
out.println(admins.containsAll(users)); // ∈,false
out.println(users.containsAll(admins)); // false
}
}
除了 Map 型態鍵值對應的物件,在 Java 中可使用 import java.util.*;
import static java.lang.System.out;
public class Main {
public static void main(String[] args) {
Map<String, Integer> passwords = new HashMap<>();
passwords.put("Justin", 123456);
passwords.put("caterpillar", 93933);
out.println(passwords.get("Justin")); // 123456
passwords.put("Hamimi", 970221); // 增加一對鍵值
out.println(passwords); // {Justin=123456, caterpillar=93933, Hamimi=970221}
passwords.remove("caterpillar"); // 刪除一對鍵值
out.println(passwords); // {Justin=123456, Hamimi=970221}
out.println(passwords.entrySet()); // [Justin=123456, Hamimi=970221]
out.println(passwords.keySet()); // [Justin, Hamimi]
out.println(passwords.values()); // [123456, 970221]
}
}
Guava CollectionsJava 標準 API 的容器物件,著重在功能性的定義與實作,少於考量易用性,加上 Java 本身又是靜態定型(Statically-typed)語言,不少地方都需要型態宣告,因而使用上就現今眼光來說,頗為不便。Java 的世界中有不少的開放原始碼程式庫,可以補強 Java 在這方面的不足,在這邊使用一下 guava-libraries 的 Collections,讓需求在操作上比較方便一些。 練習 5:使用 Guava Collections 在這個練習中,將使用 Guava Collections 來改寫先前的一些範例,不過在急著到 Guava 官方網站下載相關 jar 檔案之前,別忘了我們有安裝 Gradle,它可以自動幫你下載 jar 檔案,為此,先在使用者目錄下建立一個 Collections 目錄與 Gradle 慣例的相關子目錄: ~$ mkdir Collections ~$ cd Collections ~/Collections$ mkdir -p src/main/java ~/Collections$ st2 build.gradle 最後一個指令建立了 build.gradle 檔案,你可以如下撰寫,使用 apply plugin: 'java'
apply plugin:'application'
mainClassName = "Main"
repositories {
mavenCentral()
}
dependencies {
compile group: 'com.google.guava', name: 'guava', version: '15.0'
}
接著編輯 Main.java ~/Collections$ st2 src/main/java/Main.java 內容如下: import java.util.*;
import com.google.common.collect.*;
import static java.lang.System.*;
public class Main {
public static void main(String[] args) {
// List Demo
List<Integer> numbers = Arrays.asList(1, 2, 3);
List<Integer> collector =
ImmutableList.<Integer>builder()
.add(10)
.addAll(numbers)
.build();
out.println(collector.size()); // 4
// Set Demo
Set<String> admins = ImmutableSet.of("Justin", "caterpillar");
Set<String> users = ImmutableSet.of("momor", "hamini", "Justin");
out.println(admins.contains("Justin")); // 是否在站長群?true
out.println(Sets.intersection(admins, users)); // 同時是站長群也是使用者群的? [Justin]
out.println(Sets.union(admins, users)); // 是站長群或是使用者群的? [Justin, caterpillar, momor, hamini]
out.println(Sets.difference(admins, users)); // 站長群但不使用者群的? [caterpillar]
out.println(Sets.symmetricDifference(admins, users)); // xor [caterpillar, momor, hamini]
out.println(admins.containsAll(users)); // ∈,false
out.println(users.containsAll(admins)); // false*/
// Map Demo
Map<String, Integer> passwords = ImmutableMap.of("Justin", 123456, "caterpillar", 93933);
out.println(passwords.get("Justin")); // 123456
out.println(passwords.entrySet()); // [Justin=123456, Hamimi=970221]
out.println(passwords.keySet()); // [Justin, Hamimi]
out.println(passwords.values()); // [123456, 970221]
}
}
比較一下與先前範例的差別,看看有沒有比較方便與清楚一些,然後執行 ~/Collections$ gradle run 第一次執行時,Gradle 會自動下載 jar 檔案,然後進行編譯與執行,你應該看到以下結果: 4 true [Justin] [Justin, caterpillar, momor, hamini] [caterpillar] [caterpillar, momor, hamini] false false 123456 [Justin=123456, caterpillar=93933] [Justin, caterpillar] [123456, 93933] 如果想要瞭解更多有關 Guava Collections 或更多 guava-libraries 的介紹,可以參考本站的 Guava 教學。 if、switch、while 與 for流程語法中最簡單的 if(args.length > 1) {
out.println("Hello, " + args[0]);
} else {
out.println("Hello, Guest");
}
Java 中的 out.printf("Hello, %s%n", args.length > 1 ? args[0] : "Guest")
如果想要比對的是某些值,在 Java 中可以使用 ...
switch(args[1]) {
case "+": out.println(x.add(y)); break;
case "-": out.println(x.subtract(y)); break;
case "x": out.println(x.multiply(y)); break;
case "/": out.println(x.divide(y));
}
...
public class GCD {
public static void main(String[] args) {
int m = Integer.parseInt(args[0]);
int n = Integer.parseInt(args[1]);
while(n != 0) {
int r = m % n;
m = n;
n = r;
}
System.out.printf("GCD: %d%n", m);
}
}
for(int i = 0; i < args.length; i++) {
out.println(args[i]);
}
從頭至尾循序存取是很常見的需求,這邊介紹到的陣列、 for(String arg : args) {
out.println(arg);
}
實際上,只要是具備 練習 6:使用 foreach 迭代路徑 在 Java 中,可以查看 API 文件,確認物件是否擁有某些行為。舉例來說,想瞭解 在 All Superinterfaces 上,可以看到 類似地,查看一下 import java.nio.file.*;
public class ForEach {
public static void main(String[] args) {
for(Path parent : Paths.get(args[0])) {
System.out.println(parent);
}
}
}
這個程式可以接受命令列引數,你可以指定一個目錄,程式將會將每個子路徑顯示出來,你可以使用 |

Java 學習之路






王京彥
07/24請於文章最尾加上至"Java Tutorial 第二堂(3)方法、類別與套件"的鏈結,謝謝。