nev*_*ind 0 c c++ java code-generation coding-style
我正在尝试做一个凸壳方法,小问题是我需要得到所有三个连续顶点的集合,如下所示:
private void isConvexHull(Ponto[] points) {
Arrays.sort(points);
for (int i = 0; i <points.length; i++) {
isClockWise(points[i],points[i+1],points[i+2]);
}
//...
}
Run Code Online (Sandbox Code Playgroud)
我总是做一些我不认为干净的代码.请帮助我找到一种或多种方法吗?我希望它是循环的,即,如果我的fisrt点是数组中的最后一个元素,第二个元素将是列表中的第3个元素,该集合中的第3个元素将是列表中的第2个元素, 等等.它们必须是连续的,就是这样.
您可以使用%"技巧"(%是余数运算符JLS 15.17.3)进行循环索引.在这里,我将使用String替代来说明一般的想法.
String s = "ABCDE";
final int L = s.length();
for (int i = 0; i < L; i++) {
System.out.format("%c%c%c ",
s.charAt(i),
s.charAt((i + 1) % L),
s.charAt((i + 2) % L)
);
} // prints "ABC BCD CDE DEA EAB "
Run Code Online (Sandbox Code Playgroud)
Iterator方法但是,如果你经常进行三重处理,那么拥有Iterator<PointTriplet>或类似的东西将是更好的整体设计.
这是一个原型来说明这个想法:
import java.util.*;
public class CircSubArray {
static <T> Iterator<T[]> circularIterator(final T[] arr, final int K) {
return new Iterator<T[]>() {
int index = 0;
final int L = arr.length;
T[] sub = Arrays.copyOf(arr, K); // let it do the dirty work!
@Override public boolean hasNext() {
return index < L;
}
@Override public T[] next() {
for (int i = 0; i < K; i++) {
sub[i] = arr[(index + i) % L];
}
index++;
return sub; // we always overwrite; no need to .clone()
}
@Override public void remove() {
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] args) {
String[] arr = { "s1", "s2", "s3", "s4", "s5", "s6" };
Iterator<String[]> iter = circularIterator(arr, 4);
while (iter.hasNext()) {
System.out.println(Arrays.toString(iter.next()));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这打印:
[s1, s2, s3, s4]
[s2, s3, s4, s5]
[s3, s4, s5, s6]
[s4, s5, s6, s1]
[s5, s6, s1, s2]
[s6, s1, s2, s3]
Run Code Online (Sandbox Code Playgroud)
List基于A 的解决方案正如Effective Java 2nd Edition所说,第25项:首选列表到数组.这是一个在第一个K-1元素的末尾冗余存储的解决方案,List然后简单地用于一次subList获取K元素.
String[] arr = { "s1", "s2", "s3", "s4", "s5", "s6" };
final int L = arr.length;
final int K = 3;
List<String> list = new ArrayList<String>(Arrays.asList(arr));
list.addAll(list.subList(0, K-1));
for (int i = 0; i < L; i++) {
System.out.println(list.subList(i, i + K));
}
Run Code Online (Sandbox Code Playgroud)
这打印:
[s1, s2, s3]
[s2, s3, s4]
[s3, s4, s5]
[s4, s5, s6]
[s5, s6, s1]
[s6, s1, s2]
Run Code Online (Sandbox Code Playgroud)
由于subList是视图,因此不必O(K)进行基于阵列的解决方案所做的转移.这也显示了List过度数组的表现力.