// Week 4 – String basics in Java
// Run: java StringBasics.java
import java.util.Arrays;

public class StringBasics {
    public static void main(String[] args) {
        String s = "Hello, World";

        // Length and character by index – O(1)
        System.out.println("length = " + s.length() + ", charAt(4) = " + s.charAt(4));

        // A String is IMMUTABLE: the "modifying" methods return a new string
        String upper = s.toUpperCase();
        System.out.println("s = " + s + ", upper = " + upper);

        // Comparison: == compares references, equals compares contents!
        String a = "data";
        String b = "data";                 // the same literal -> from the string pool
        String c = new String("data");     // a new object
        System.out.println("a == b: " + (a == b) + ", a == c: " + (a == c) + ", a.equals(c): " + a.equals(c));

        // Lexicographic comparison: negative / 0 / positive
        System.out.println("\"apple\".compareTo(\"banana\") = " + "apple".compareTo("banana"));
        System.out.println("\"Zebra\".compareTo(\"apple\") = " + "Zebra".compareTo("apple") + "  (upper case < lower case!)");
        System.out.println("equalsIgnoreCase: " + "Java".equalsIgnoreCase("JAVA"));

        // Searching
        System.out.println("indexOf(\"o\") = " + s.indexOf("o") + ", lastIndexOf(\"o\") = " + s.lastIndexOf("o")
                + ", contains(\"World\") = " + s.contains("World"));

        // Substring: [start, end) – the end index is not included
        System.out.println("substring(7) = " + s.substring(7) + ", substring(0, 5) = " + s.substring(0, 5));

        // Splitting and joining
        String csv = "Wuhan,Beijing,Shanghai";
        String[] parts = csv.split(",");
        System.out.println("split: " + Arrays.toString(parts));
        System.out.println("join:  " + String.join(" | ", parts));

        // Replacing, trimming spaces
        System.out.println("replace: " + s.replace("World", "Hubei"));
        System.out.println("trim: [" + "   text   ".trim() + "]");

        // Between strings and character arrays
        char[] chars = s.toCharArray();
        Arrays.sort(chars);
        System.out.println("sorted characters: " + new String(chars).trim());

        // Number <-> string
        int n = Integer.parseInt("42");
        String t = String.valueOf(3.14);
        System.out.println("parseInt + 1 = " + (n + 1) + ", valueOf = " + t);
    }
}
