一、需求
给定一个String对象,过滤掉除数字(字符'0'-'9')以外的其它字符。要求时间开销尽可能小。过滤函数的原型如下: String filter(String str);
二、代码测试
public static void main(String[] args) {
String str = "";
long begin = System.currentTimeMillis();
for(int i=0;i<1024*1024;i++) {
str = filter7("D186783E36B721651E8AF96AB1C4000B");
}
long end = System.currentTimeMillis();
System.out.println("测试用时:"+(end-begin));
System.out.println(str);
}
三、不同版本
/**
* 过滤方法-1-
* 测试用时:4328
* 运行结果:1867833672165189614000
* 注:这种方法效果是最差的,拼接字符串时 起码也要想到StringBuffer或StringBuilder
*/
public static String filter1(String str) {
String newStr = new String();
for(int i=0;i<str.length();i++) {
if(str.charAt(i) >= '0' && str.charAt(i) <= '9') {
newStr += str.charAt(i);
}
}
return newStr;
}
/**
* 过滤方法-2-
* 测试用时:1656
* 运行结果:1867833672165189614000
* 注:使用StringBuffer后效率明显提高了
*/
public static String filter2(String str) {
StringBuffer sb = new StringBuffer();
for(int i=0;i<str.length();i++) {
if(str.charAt(i) >= '0' && str.charAt(i) <= '9') {
sb.append(str.charAt(i));
}
}
return sb.toString();
}
/**
* 过滤方法-3-
* 测试用时:625
* 运行结果:1867833672165189614000
* 注:使用StringBuilder后效率也有不错的提升,因为StringBuffer是线程安全的它的方法都是同步的,
* 因此调用他的方法有一定的同步开销
*/
public static String filter3(String str) {
StringBuilder sb = new StringBuilder();
for(int i=0;i<str.length();i++) {
if(str.charAt(i) >= '0' && str.charAt(i) <= '9') {
sb.append(str.charAt(i));
}
}
return sb.toString();
}
/**
* 过滤方法-4-
* 测试用时:625
* 运行结果:1867833672165189614000
* 注:循环时就不必每次都计算一下传入的字符串的长度了,但是发现效率没有提升,可能是jdk自己做了优化
*/
public static String filter4(String str) {
StringBuilder sb = new StringBuilder();
int length = str.length();
for(int i=0;i<length;i++) {
if(str.charAt(i) >= '0' && str.charAt(i) <= '9') {
sb.append(str.charAt(i));
}
}
return sb.toString();
}
/**
* 过滤方法-5-
* 测试用时:594
* 运行结果:1867833672165189614000
* 注:通过StringBuilder的构造函数设置初始的容量大小,可以有效避免append()追加字符时重新分配内存,从而提高性能.
*/
public static String filter5(String str) {
int length = str.length();
StringBuilder sb = new StringBuilder(length);
for(int i=0;i<length;i++) {
if(str.charAt(i) >= '0' && str.charAt(i) <= '9') {
sb.append(str.charAt(i));
}
}
return sb.toString();
}
/**
* 过滤方法-6-
* 测试用时:562
* 运行结果:1867833672165189614000
* 注:少了个str.charAt(i)提升效果不明显
*/
public static String filter6(String str) {
int length = str.length();
StringBuilder sb = new StringBuilder(length);
for(int i=0;i<length;i++) {
char ch = str.charAt(i);
if(ch >= '0' && ch <= '9') {
sb.append(ch);
}
}
return sb.toString();
}
/**
* 过滤方法-7-
* 测试用时:406
* 运行结果:1867833672165189614000
* 注:相比filter6 7里面有字符数组创建的开销, 而StringBuilder也有字符数组创建的开销.
* 二者差别就在于7少了StringBuilder对象创建的开销
*/
public static String filter7(String str) {
int length = str.length();
char[] chArray = new char[length];
int index = 0;
for(int i=0;i<length;i++) {
char ch = str.charAt(i);
if(ch >= '0' && ch <= '9') {
chArray[index] = ch;
index++;
}
}
return new String(chArray,0,index);
}
四、补充
版本6和版本7使用了空间换时间的手法来提升性能。假如被过滤的字符串很大,并且数字字符的比例很低,这种方式就不太合算了。
举个例子:被处理的字符串中,绝大部分都只含有不到10%的数字字符,只有少数字符串包含较多的数字字符。这时候该怎么办捏?对于filter6来说,可以把new StringBuffer(nLen);修改为new StringBuffer(nLen/10);来节约空间开销。但是filter7就没法这么玩了。
所以,具体该用版本6还是版本7,要看具体情况了。只有在你非常看重时间开销,且数字字符比例很高(至少大于50%)的情况下,用filter7才合算。否则的话,建议用filter6。
分享到:
相关推荐
在本场景中,我们可能需要一个函数或方法来检查传递的字符串是否符合JSON的标准格式,以确保数据的有效性和正确性。 首先,我们需要了解JSON的基本结构。一个有效的JSON字符串必须满足以下条件: 1. 数据是键值对,...
在Java编程中,字符串处理是常见的任务之一。本问题提供了两个具体的字符串操作...以上就是关于Java实现字符串过滤和字符串压缩的详细解释,以及相应的代码实现。在实际开发中,可以依据具体需求进行适当的优化和调整。
将字符串转换为`lambda`表达式的一个实际应用是动态构建过滤条件。例如,在GUI应用中,用户可以输入一个表达式,如`'price > 100'`,然后程序将其转换为一个`lambda`函数,用于筛选数据。这样,用户可以通过界面实时...
在Java编程语言中,`StrUtil`类通常指的是一个实用工具类,用于处理和操作字符串。这个类可能包含了各种方便的方法,比如字符串的拼接、分割、格式化、检查是否为空等。`StrUtil`不是Java标准库的一部分,但它是许多...
2. `AnsiContainsText` 函数:该函数用来检查一个字符串(AText)是否包含另一个字符串(ASubText),同样不区分大小写。这对于搜索和过滤功能非常有用,可以快速判断目标文本是否包含特定的关键字或子句。在实际...
这个函数可以接受一个字符串参数,并返回一个 `Pattern` 对象。例如: ```java Pattern p = Pattern.compile(regEx); ``` 这个示例代码将编译 `regEx` 字符串,并返回一个 `Pattern` 对象。 总结 本文详细介绍了 ...
总结起来,Java中的敏感词过滤涉及到了数据结构的选择、字符串匹配算法的应用以及具体实现的优化。通过理解这些概念并结合`FilterCode`中的代码,我们可以创建一个高效、准确的敏感词过滤系统,有效地管理和控制文本...
该类可以将一个字符串按照指定的分隔符分割成多个子字符串(即Token)。 ##### 2.1 创建`StringTokenizer`实例 ```java String s = "Hello every.one, I am Xing.zh.l, she is my friend"; StringTokenizer fenxi ...
首先,我们来看一个名为`StringUtil.java`的文件,它很可能包含了一些实用的字符串处理方法。在这个文件中,我们可以预期找到用于处理空格的函数。虽然具体的实现没有给出,但通常我们可以使用几种不同的方法来实现...
在Java编程领域,日志文件过滤是一个至关重要的实践,它主要涉及到如何管理和分析应用程序生成的日志数据。日志记录是程序运行过程中的诊断工具,它记录了程序运行时的事件和异常,帮助开发者追踪错误、优化性能。本...
在示例代码中,我们看到一个寻找不含字母"A"的字符串的方法,使用了多个`filter()`操作。这里,每个`filter()`函数都是一个条件检查,但它们的执行是延迟的。直到调用`findFirst()`方法时,流才会开始遍历并执行这些...
3. **实现过滤逻辑**:定义过滤条件,这可能是一个函数或一个接口,用于检查节点是否满足特定条件。例如,如果我们要过滤出名字以特定字符开头的节点,可以编写一个方法检查节点的名字。 4. **应用过滤**:遍历整个...
这些函数接受一个目标字符串作为参数,并返回目标字符串在原字符串中首次出现的位置。如果未找到,则返回特定的负值或抛出异常。 替换操作则涉及将字符串中的某个或某些特定子字符串替换成另一个字符串。在Python中...
7. **应用示例**:例如,你可能有一个动态查询系统,用户可以输入 "x > 10 && y 这样的字符串,然后通过解析这个字符串,将其转换为对应的 Lambda 表达式 `(x, y) => x > 10 && y ,用以过滤数据。 8. **最佳实践**...
在整个项目中进行查询字符串的搜索是一项常见的开发任务,这有助于开发者快速定位代码中的特定文本、变量、函数或者问题。在本文中,我们将深入探讨如何在不同的开发环境中有效地进行全局搜索,特别是针对Java和JSP...
替换字符串通常涉及到`str.replace()`方法,它会将字符串中的某个子串替换为另一个字符串。在Python中,`str.replace(old, new[, count])`接受三个参数,old是要被替换的子串,new是替换后的字符串,count是可选的,...
通过传递一个替换函数作为第二个参数,可以控制如何处理这些情况,或者过滤某些敏感信息。 4. **美化输出与`indent`参数**:第三个参数`indent`可以是一个字符串或数字,用于在每个级别添加缩进。例如,`JSON....
3. `capitalize()` 函数:将字符串的第一个字符转换为大写,其余字符转为小写。 示例: ```python str = "hello, world!" cap_str = str.capitalize() print(cap_str) # 输出 "Hello, world!" ``` 4. `title...
在Java编程语言中,统计一个字符串中每个字母的个数是一项基本任务,它涉及到字符串处理和字符遍历。下面我们将详细探讨如何实现这个功能,并扩展到相关的字符串操作和字符统计的知识点。 首先,我们需要理解Java中...