我看到这里的人发表评论,比如"正则表达式太慢了!",或者"你为什么要用正则表达式做一些简单的事情!" (然后提出10+行代替)等.
我还没有真正在工业环境中使用正则表达式,所以我很好奇是否有正则表达式显然太慢的应用程序,并且存在一个简单的非正则表达式替代方案,其表现更好(甚至可能渐近!)更好.
很明显,许多使用复杂字符串算法的高度专业化的字符串操作将轻松胜过正则表达式,但我所说的是存在简单解决方案且明显优于正则表达式的情况.
怎样才算是简单的是主观的,当然,但我认为一个合理的标准是,如果仅使用String,StringBuilder等等,那么它可能简单.
注意:我非常感谢证明以下内容的答案:
我的女朋友在接受采访时得到了这个问题,我非常喜欢它,我以为我会分享它......写一个接收字典的算法(字数组).数组按字典顺序排序,但abc顺序可以是任何内容.例如,它可以是z,y,x,..,c,b,a.或者它可能完全搞砸了:d,g,w,y,......它甚至不需要包含所有的abc字母,最后它根本不必是字母.它可以是形成字符串的任何符号.例如,它可以由5,?,!,@,?组成......你明白了.由您的算法决定发现字母是什么(简单部分).
算法应返回符号的正确词典顺序.
注意事项/需要考虑的事项:1.对于给定的字典,您是否总能发现所有字母的完整顺序?考虑一个只有1个单词,多于1个符号的字典...... 2.你不能认为字典是没有错误的.该算法应确定字典是否包含矛盾并输出存在错误.3.提示:想一个好的数据结构来表示你在符号之间发现的关系.这应该使问题更容易.
我明天可能会发布我的解决方案.我绝不会声称它是最有效的.我想先看看其他人的想法.希望你喜欢这个问题
PS我认为发布解决方案的最佳格式是使用伪代码,但我将此留待您考虑
以下是java.text.CharacterIterator文档的摘录:
这
interface定义了一个用于文本双向迭代的协议.迭代器迭代有界字符序列.[...]方法previous()和next()用于迭代.它们返回DONE[...],表示迭代器已到达序列的末尾.
static final char DONE:迭代器到达文本的结尾或开头时返回的常量.值是\uFFFF,不是任何有效的Unicode字符串中不应出现的"非字符"值.
斜体部分是我无法理解的部分,因为从我的测试来看,它看起来像Java String当然可以包含\uFFFF,并且似乎没有任何问题,除了明显的规定的CharacterIterator遍历习惯因为打破因为假阳性(例如,当它没有真正"完成"时next()返回'\uFFFF' == DONE).
这里有一个片段来说明"问题"(另见ideone.com):
import java.text.*;
public class CharacterIteratorTest {
// this is the prescribed traversal idiom from the documentation
public static void traverseForward(CharacterIterator iter) {
for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
System.out.print(c);
}
}
public static void main(String[] args) {
String …Run Code Online (Sandbox Code Playgroud) class Bouncy<T> extends Throwable {
}
// Error: the generic class Bouncy<T> may not subclass java.lang.Throwable
Run Code Online (Sandbox Code Playgroud)
为什么Java不支持泛型Throwable?
我意识到类型擦除使某些事情变得复杂,但显然Java已经经历了很多,所以为什么不再推动它,并允许泛型Throwables,通过全面的编译时检查潜在的问题?
我觉得类型擦除论证相当薄弱.目前,我们做不到:
void process(List<String> list) {
}
void process(List<Integer> list) {
}
Run Code Online (Sandbox Code Playgroud)
当然,我们没有它.我不要求,我们应该能够做到catch Bouncy<T1>,并Bouncy<T2>在同一个try块,但是如果我们使用他们在严格的编译时可执行的规则不相交的上下文(这是相当多的仿制药的工作方式现在),你说对不对可行吗?
注意:这是关于null的Comparable和Comparator合同的衍生产品
这段代码在Eclipse(20090920-1017)中编译并运行良好
import java.util.*;
public class SortNull {
static <T extends Comparable<? super T>>
Comparator<T> nullComparableComparator() {
return new Comparator<T>() {
@Override public int compare(T el1, T el2) {
return
el1 == null ? -1 :
el2 == null ? +1 :
el1.compareTo(el2);
}
};
}
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<Integer>(
Arrays.asList(3, 2, 1, null, null, 0)
);
Comparator<Integer> numbersComp = nullComparableComparator();
Collections.sort(numbers, numbersComp);
System.out.println(numbers);
// "[null, null, 0, …Run Code Online (Sandbox Code Playgroud) 我有一个巨大的表,在某些列上具有更小的数量(按数量级)不同的值x.
我需要做一个查询SELECT DISTINCT x FROM hugeTable,我想要相对快速地做这个.
我做了类似的事情CREATE INDEX hugeTable_by_x ON hugeTable(x),但由于某种原因,即使输出很小,查询执行也不是那么快.查询计划显示97%的时间花在索引扫描上hugeTable_by_x,估计行数等于整个表的大小.接下来是哈希匹配操作.
由于我在列上创建了索引x,我不能指望此查询运行得非常快吗?
请注意,我正在使用Microsoft SQL Server 2005.
我经常在代码中看到这个,但是当我说到它时,我不知道这种'模式'的名称
我有一个带有2个参数的方法,它调用一个有3个参数的重载方法,并故意将第3个参数设置为空字符串.
public void DoWork(string name, string phoneNumber)
{
DoWork(name, phoneNumber, string.Empty)
}
private void DoWork(string name, string phoneNumber, string emailAddress)
{
//do the work
}
Run Code Online (Sandbox Code Playgroud)
我这样做的原因是不重复代码,并允许现有的调用者仍然调用只有2个参数的方法.
这是一种模式,它有一个名字吗?
我想TreeMap用Java 创建一个自定义排序顺序.需要根据第二个字符对作为字符串的排序键进行排序.值也是字符串.
示例地图:
Za,FOO
Ab,Bar
Run Code Online (Sandbox Code Playgroud) 这是一系列教育正则表达式文章的第三部分.它遵循这个正则表达式如何找到三角形数字?(首先介绍嵌套引用)和如何将^ nb ^ n与Java正则表达式匹配? (前瞻性"计数"机制进一步详述).这部分介绍了一种特定形式的嵌套断言,当与嵌套引用结合使用时,Java正则表达式可以匹配大多数人认为"不可能"的东西:回文!
回文的语言是非常规的 ; 它实际上是无上下文的(对于给定的字母表).也就是说,现代正则表达式实现不仅仅识别常规语言,Perl/PCRE的递归模式和.NET的平衡组可以很容易地识别回文(参见:相关问题).
但是,Java的正则表达式引擎既不支持这些"高级"功能.然而"某人" (*wink*)成功编写了以下正则表达式,这似乎做得很好(参见ideone.com):
public class Palindrome {
// asserts that the entirety of the string matches the given pattern
static String assertEntirety(String pattern) {
return "(?<=(?=^pattern$).*)".replace("pattern", pattern);
}
public static void main(String[] args) {
final String PALINDROME =
"(?x) | (?:(.) add)+ chk"
.replace("add", assertEntirety(".*? (\\1 \\2?)"))
.replace("chk", assertEntirety("\\2"));
System.out.println(PALINDROME);
// (?x) | (?:(.) (?<=(?=^.*? (\1 \2?)$).*))+ (?<=(?=^\2$).*)
String[] tests …Run Code Online (Sandbox Code Playgroud) 嘿,我想在我的网站上绘制基于PHP的图形(Stdent标记分布).我怎样才能做到这一点?
java ×7
string ×3
algorithm ×2
generics ×2
regex ×2
c# ×1
comparator ×1
draw ×1
graph-theory ×1
graphics ×1
indexing ×1
lookaround ×1
oop ×1
overloading ×1
palindrome ×1
performance ×1
php ×1
puzzle ×1
sorting ×1
sql ×1
t-sql ×1
terminology ×1
throwable ×1
treemap ×1
unicode ×1