算法(4th ed)(83):基础——数据抽象 4.2.3

阅读数:5 2019 年 11 月 2 日 12:08

算法(4th ed)(83):基础——数据抽象 4.2.3

(抽象数据类型举例:字符串)

Java 的String 是一种重要而实用的抽象数据类型。一个 String 值是一串可以由索引访问的 char 值。String 对象拥有许多实例方法,如表 1.2.7 所示。

表 1.2.7 Java 的字符串 API(部分)

Public class String
             String()创建一个空字符串
        int  length()字符串长度
        int  charAt(int i)i 个字符
        int  indexOf(String p)p 第一次出现的位置(如果没有则返回 -1
        int  indexOf(String p, int i)pi 个字符后第一次出现的位置(如果没有则返回 -1
     String  concat(String t)t 附在该字符串末尾
     String  substring(int i, int j)该字符串的子字符串(第 i 个字符到第 j-1 个字符)
   String[]  split(String delim)使用 delim 分隔符切分字符串
        int  compareTo(String t)比较字符串
    boolean  equals(String t)该字符串的值和 t 的值是否相同
        int  hashCode()散列值

String 值和字符数组类似,但两者是不同的。数组能够通过 Java 语言的内置语法访问每个字符,String 则为索引访问、字符串长度以及其他许多操作准备了实例方法。另一方面,Java 语言为String 的初始化和连接提供了特别的支持:我们可以直接使用字符串字面量而非构造函数来创建并初始化一个字符串,还可以直接使用+ 运算符代替 concat() 方法。我们不需要了解实现的细节,但是在第 5 章中你会看到,了解某些方法的性能特点在开发字符串处理算法时是非常重要的。为什么不直接使用字符数组代替 String 值?对于任何抽象数据类型,这个问题的答案都是一样的:为了使代码更加简洁清晰。有了 String 类型,我们可以写出清晰干净的用例代码而无需关心字符串的表示方式。先看一下右侧这段短小的列表,其中甚至含有一些需要我们在第 5 章才会学到的高级算法才能实现的强大操作。例如,split() 方法的参数可以是正则表达式(请见 5.4 节),“典型的字符串处理代码”(显示在下页)中split() 的参数是"\\s+",它表示“一个或多个制表符、空格、换行符或回车”。

字符串操作举例
任务 实现
判断字符串是否是一条回文
public static boolean isPalindrome(String s)
{
int N = s.length();
for (int i = 0; i < N/2; i++)
if (s.charAt(i) != s.charAt(N-1-i))
return false;
return true;
}
从一个命令行参数中提取文件名和扩展名
String s = args[0];
int dot = s.indexOf(".");
String base = s.substring(0, dot);
String extension = s.substring(dot + 1, s.length());
打印出标准输入中所有含有通过命令行指定的字符串的行
String query = args[0];
while (!StdIn.isEmpty())
{
String s = StdIn.readLine();
if (s.contains(query)) StdOut.println(s);
}
以空白字符为分隔符从 StdIn 中创建一个字符串数组
String input = StdIn.readAll();
String[] words = input.split("\s+");
检查一个字符串数组中的元素是否已按照字母表顺序排列
public boolean isSorted(String[] a)
{
for (int i = 1; i < a.length; i++)
{
if (a[i-1].compareTo(a[i]) > 0)
return false;
}
return true;
}
典型的字符串处理代码

评论

发布