这是一系列教育正则表达式文章的一部分,这是对嵌套引用概念的温和介绍.
前几个三角形数字是:
1 = 1
3 = 1 + 2
6 = 1 + 2 + 3
10 = 1 + 2 + 3 + 4
15 = 1 + 2 + 3 + 4 + 5
Run Code Online (Sandbox Code Playgroud)
有很多方法可以检查数字是否为三角形.有一种有趣的技术使用正则表达式如下:
^(\1.|^.)+$
以下是一些片段,表明它适用于多种语言:
$r = '/^(\1.|^.)+$/';
foreach (range(0,50) as $n) {
if (preg_match($r, str_repeat('o', $n))) {
print("$n ");
}
}
Run Code Online (Sandbox Code Playgroud)
for (int n = 0; n <= 50; …Run Code Online (Sandbox Code Playgroud) 假设我有两个char变量,后来我想将它们连接成一个字符串.我就是这样做的:
char c1, c2;
// ...
String s = "" + c1 + c2;
Run Code Online (Sandbox Code Playgroud)
我见过有人说"" +"诡计"是"丑陋"等等,你应该使用String.valueOf或Character.toString代替.我更喜欢这种结构,因为:
c1并且c2在视觉上处于同一水平
String.valueOf(c1) + c2 建议一些特别的东西 c1真的有一个很好的论据为什么String.valueOf或者Character.toString更喜欢"" +?
琐事:在java.lang.AssertionError,下面一行出现7次,每次都有不同的类型:
this("" + detailMessage);
Run Code Online (Sandbox Code Playgroud) 以下在我的Eclipse中编译得很好:
final int j = 1/0;
// compiles fine!!!
// throws ArithmeticException: / by zero at run-time
Run Code Online (Sandbox Code Playgroud)
Java的防止了许多"哑代码"从甚至在首位编译(如"Five" instanceof Number不编译),所以其实这甚至没有产生尽可能多的警告是非常令我感到诧异.当您考虑允许在编译时优化常量表达式这一事实时,阴谋会加深:
public class Div0 {
public static void main(String[] args) {
final int i = 2+3;
final int j = 1/0;
final int k = 9/2;
}
}
Run Code Online (Sandbox Code Playgroud)
在Eclipse中编译,上面的代码片段生成以下字节码(javap -c Div0)
Compiled from "Div0.java"
public class Div0 extends java.lang.Object{
public Div0();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: …Run Code Online (Sandbox Code Playgroud) Comparable合同规定e.compareTo(null)必须抛出NullPointerException.
来自API:
请注意,这
null不是任何类的实例,并且e.compareTo(null)应该抛出一个NullPointerException偶数e.equals(null)返回false.
另一方面,ComparatorAPI没有提及比较时需要发生的事情null.考虑以下尝试采用a的泛型方法Comparable,并Comparator为其null作为最小元素返回.
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);
}
};
}
Run Code Online (Sandbox Code Playgroud)
这允许我们执行以下操作:
List<Integer> numbers = new ArrayList<Integer>(
Arrays.asList(3, 2, 1, null, …Run Code Online (Sandbox Code Playgroud) 进行三向异或的最简单方法是什么?
换句话说,我有三个值,我想结果为true IFF只声明一个三个值是真实的.
到目前为止,这是我提出的:
((a ^ b)&&(a ^ c)&&!(b && c))|| ((b ^ a)&&(b ^ c)&&!(a && c))|| ((c ^ a)&&(c ^ b)&&!(a && b))
是否有更简单的事情做同样的事情?
以下是上述完成任务的证明:
a = true; b = true; c = true
((a ^ b) && (a ^ c) && !(b && c)) || ((b ^ a) && (b ^ c) && !(a && c)) || ((c ^ a) && (c ^ b) && !(a && b))
=> false
a = true; b = …Run Code Online (Sandbox Code Playgroud) 我最近接受了这个采访问题:
给定12小时模拟时钟,以度为单位计算小时和分针之间的较小角度.尽你所能精确.
我想知道什么是最简单,最可读,最精确的算法.欢迎使用任何语言的解决方案(但如果您认为有必要,请稍微解释一下).
我认为java.math.BigDecimal应该是The Answer™需要用十进制数执行无限精度算术.
请考虑以下代码段:
import java.math.BigDecimal;
//...
final BigDecimal one = BigDecimal.ONE;
final BigDecimal three = BigDecimal.valueOf(3);
final BigDecimal third = one.divide(three);
assert third.multiply(three).equals(one); // this should pass, right?
Run Code Online (Sandbox Code Playgroud)
我希望assert通过,但事实上执行甚至没有到达那里:one.divide(three)原因ArithmeticException被抛出!
Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide
Run Code Online (Sandbox Code Playgroud)
事实证明,API中明确记录了此行为:
在这种情况下
divide,准确的商可能有一个无限长的十进制扩展; 例如,1除以3.如果商具有非终止十进制扩展并且指定操作以返回精确结果,ArithmeticException则抛出a.否则,返回除法的确切结果,与其他操作一样.
进一步浏览API,人们发现实际上有各种重载divide执行不精确的划分,即:
final BigDecimal third = one.divide(three, 33, RoundingMode.DOWN);
System.out.println(three.multiply(third));
// prints "0.999999999999999999999999999999999"
Run Code Online (Sandbox Code Playgroud)
当然,现在显而易见的问题是"有什么意义?".BigDecimal当我们需要 …
是否有一种惯用的方式来获取a Set<K>和a Function<K,V>,并获得Map<K,V>实时视图?(即Map由Set和Function组合支持,如果例如添加了元素Set,则相应的条目也存在于Map)中.
(Collections2.filter有关实时视图的更多讨论,请参阅
如果不需要实时视图怎么办?有没有比这更好的东西:
public static <K,V> Map<K,V> newMapFrom(Set<K> keys, Function<? super K,V> f) {
Map<K,V> map = Maps.newHashMap();
for (K k : keys) {
map.put(k, f.apply(k));
}
return map;
}
Run Code Online (Sandbox Code Playgroud) 我宣布一个字段:
private static final String filename = "filename.txt";
Run Code Online (Sandbox Code Playgroud)
首先,private static final物质的顺序是什么?如果没有,是否有标准接受的序列或惯例?
其次,filename在我的应用程序中是固定的.这是最好的存储价值吗?
假设我想匹配"单词"字符(\w),但排除"_",或匹配空白字符(\s),但排除"\ t".我怎样才能做到这一点?
java ×7
precision ×2
regex ×2
angle ×1
bigdecimal ×1
boolean ×1
c# ×1
coding-style ×1
collections ×1
comparable ×1
comparator ×1
division ×1
final ×1
financial ×1
generics ×1
guava ×1
logic ×1
math ×1
null ×1
perl ×1
private ×1
static ×1
string ×1
xor ×1