过滤相邻值并对其应用函数

时间:2016-03-09 00:15:15

标签: java

我有数字列表,例如1,5,10,15。假设这些是链接,当前输入是1,那么我只能看到5,这是“下一个”值。当输入为5时,我将能够看到值1,表示“前一个”,10表示“下一个”。我只关心下一个和前一个,而不是过去这些或输入本身。数组始终是有序的,没有重复项。

我正在寻找一个很好的方法来找出这些下一个和前一个值来自整数数组,然后在一个或两个值上调用一个函数,具体取决于它是否有2个相邻值或只有一个,如果它是第一个或最后一个元素。

我一直在尝试使用Java 8 lambdas来实现一些漂亮和流畅的东西,但结果却不是很干净的代码。

任何人都可以就此提出建议吗?

3 个答案:

答案 0 :(得分:1)

我认为在这种情况下使用流是不合适的。在已排序的数组上使用二进制搜索来查找元素的索引,然后在上一个和下一个索引中调用使用者(如果它们存在于数组中):

<E> void invokeOnPreviousAndNext(E[] array, E element, Consumer<E> consumer) {
    int index = Arrays.binarySearch(array, element);
    if (index > 0) {
        consumer.accept(array[index - 1]);
    } 
    if (index >= 0 && index < array.length - 1) {
        consumer.accept(array[index + 1]);
    }
}

以下代码:

Integer[] array = { 1, 5, 10, 15 };
invokeOnPreviousAndNext(array, 1, s -> System.out.printf("%s ", s));
System.out.println("//");
invokeOnPreviousAndNext(array, 5, s -> System.out.printf("%s ", s));
System.out.println("//");
invokeOnPreviousAndNext(array, 10, s -> System.out.printf("%s ", s));
System.out.println("//");
invokeOnPreviousAndNext(array, 15, s -> System.out.printf("%s ", s));
System.out.println("//");
invokeOnPreviousAndNext(array, 0, s -> System.out.printf("%s ", s));
System.out.println("//");

将输出以下内容:

5 //
1 10 //
5 15 //
10 //
//

请注意,即使在数组中找不到该元素,它也能正常工作。

答案 1 :(得分:0)

.content-wrapper {
  height: 300px;
  width: 300px;
  margin: 0 auto;
  background-color: blue;
  position: relative;
  overflow: hidden;
  box-sizing: border-box;
}

.content {
  float: right;
  height: 100%;
  width: 100%;
  overflow-y: auto;
  padding: 20px;
  position: relative;
  box-sizing: border-box;
}

.top-shadow {
  display: none;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 20px;
  background: #000;
  background: rgba(0, 0, 0, 0.5);
  background: -moz-linear-gradient(top, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%);
  background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0.5)), color-stop(100%, rgba(0, 0, 0, 0)));
  background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%);
  background: -o-linear-gradient(top, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%);
  background: -ms-linear-gradient(top, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%);
  background: linear-gradient(to bottom, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%);
  filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#000000', endColorstr='#000000', GradientType=0);
}

.bottom-shadow {
  display: none;
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 20px;
  background: #000;
  background: rgba(0, 0, 0, 0);
  background: -moz-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.5) 100%);
  background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 0.5)));
  background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.5) 100%);
  background: -o-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.5) 100%);
  background: -ms-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.5) 100%);
  background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.5) 100%);
  filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#000000', endColorstr='#000000', GradientType=0);
}

答案 2 :(得分:-1)

您可以使用java.util.Arrays通过Arrays.asList(array)将数组转换为列表,以创建返回下一个和上一个条目的方法(假设没有重复项,并且列表已按顺序排列,如问题说:)

public int getPrevious(int[] array, int entry){
    try {
        return array[Arrays.asList(array).indexOf(entry) - 1];
    } catch (ArrayIndexOutOfBoundsException e) {
        //if code gets here, this means that the entry passed is the first entry
    }
}

public int getNext(int[] array, int entry){
    try {
        return array[Arrays.asList(array).indexOf(entry) + 1];
    } catch (ArrayIndexOutOfBoundsException e) {
        //if code gets here, this means that the entry passed is the last entry
    }
}