
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); } } } 這個程式可以接受命令列引數,你可以指定一個目錄,程式將會將每個子路徑顯示出來,你可以使用 |
王京彥
07/24
請於文章最尾加上至"Java Tutorial 第二堂(3)方法、類別與套件"的鏈結,謝謝。