List<Integer> = [1,2,3,4,8,7,5,6]
List<List<Integer>> = [[1,2,3,4,8], [8,7,5], [5,6]]
List<Integer> = [8,7,8,9]
List<List<Integer>> = [[8,7], [7,8,9]]
List<Integer> = [1,2,2,1]
List<List<Integer>> = [[1,2], [2,2], [2,1]]
这里有些东西可能会有帮助。在重要的地方增加了说明作为注释。
关键组件是简单的枚举方向
。除了“上升”和“下降”之外,我还假定了“平等”。如果不是必需的,则根据您的选择,在direction.asc
或direction.desc
中包含equals check。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiPredicate;
public class SortedSubLists{
public static void main( String[] args ){
List<List<Integer>> testData = Arrays.asList(
Arrays.asList( 1,2,3,4,8,7,5,6 ),
Arrays.asList( 8,7,8,9 ),
Arrays.asList( 1,2,2,1 )
);
for( List<Integer> input : testData ) {
List<List<Integer>> subLists = split( input );
System.out.println( "\r\nInput: " + input );
for( List<Integer> l : subLists ) System.out.println( l );
}
}
/** Represents the direction of the movement of data */
private static enum Direction {
ASC(( prev, curr ) -> prev - curr < 0), DESC(( prev, curr ) -> prev - curr > 0), EQ(( prev, curr ) -> prev - curr == 0);
private Direction( BiPredicate<Integer, Integer> applicability ){
this.applicability = applicability;
}
private BiPredicate<Integer, Integer> applicability;
static Direction get( Integer prev, Integer curr ){
for( Direction d : values() ){
if( d.applicability.test( prev, curr ) ) return d;
}
return null;
}
}
private static List<List<Integer>> split( List<Integer> list ){
Direction dir = null;
List<List<Integer>> result = new ArrayList<>();
Integer prev = null;
List<Integer> currList = null;
for( Integer i : list ){
/* For the first element in the input, create a sub-list here and add the first element. */
if( prev == null ) {
currList = newList( result );
currList.add( i );
}
else{
/* Find the direction. If it has changed, create a new sub-list. Otherwise, continue with the
* existing one. */
Direction newDir = Direction.get( prev, i );
if( dir == null ) dir = newDir;
else{
if( dir != newDir ) {
dir = newDir;
currList = newList( result );
currList.add( prev );
}
}
currList.add( i );
}
prev = i;
}
return result;
}
private static List<Integer> newList( List<List<Integer>> result ){
List<Integer> newList = new ArrayList<>();
result.add( newList );
return newList;
}
}
运行程序的输出
Input: [1, 2, 3, 4, 8, 7, 5, 6]
[1, 2, 3, 4, 8]
[8, 7, 5]
[5, 6]
Input: [8, 7, 8, 9]
[8, 7]
[7, 8, 9]
Input: [1, 2, 2, 1]
[1, 2]
[2, 2]
[2, 1]
问题内容: 我确信这个问题以前可能已经被问过,但我似乎找不到正确的答案。如果我有两个清单 我正在尝试使用_list1重新排列_list2中的元素,以便它们完全匹配顺序。什么是最干净的方法?所需的输出: 很抱歉,如果这是重复的,但到目前为止,我只能使用压缩的sorted()方法找到数字列表的答案。 如果_list2是列表列表怎么办? 所需输出: 还有一个假设:如果我想使用_list1作为键对其他任何
问题内容: 我有一个这样的字符串列表: 使用Y中的值对X进行排序以获取以下输出的最短方法是什么? 具有相同“键”的元素的顺序无关紧要。我可以求助于for结构的使用,但我好奇是否有更短的方法。有什么建议么? 问题答案: 最短代码 例: 一般来说 解释: 两个。 创建一个新的,list基于zip使用排序sorted()。 使用列表推导从排序的,压缩的中提取每对的第一个元素list。
问题内容: 我正在使用python 2.7.3,并且尝试根据另一个列表的值顺序对字典列表进行排序。 IE浏览器: 根据listOne中值的顺序对listTwo进行排序,结果如下: 我最终需要输出此文本,因此为正确显示(以正确的顺序)所做的工作如下: 是否有某种lambda表达式可用于实现此目的?必须有一种更紧凑,更简单的方法来按我想要的顺序来获取它。 问题答案: 最简单的方法是使用来为您的词典列表
创建一个Java方法,它将列表作为参数(MasterList)并返回另一个列表(ExpectedList)。 列表中每个对象都有两个变量: null 我试图实现的逻辑是:当有多个ID相同的对象时,只考虑计数较大的特定对象。表示ID:有3个对象,所以我只考虑(ID:abc122,Count:20),因为在ID:abc122的对象中Count更高。在结束时,方法应返回
问题内容: 我已经由我的用户组成。在数据库查询之后,我正在检索。我想根据第一个ID列表订购此列表。可能不包括某些ID。番石榴对列表进行排序的方式是什么? 问题答案: 使用番石榴的完全“功能性”方式将与 您可以内联声明一个匿名函数,但是我想在一个单独的类中将我的函数声明为静态工厂方法,以获取更简洁的代码(Java的函数声明的详细信息隐藏在实用程序类中): 正如@Arne在评论中提到的那样,可以在Ja
问题内容: 我有以下清单 我想根据其子列表的长度对列表进行排序。结果应为: 问题答案: 使用和中可用的参数。它指定一个参数的功能,该参数用于从每个列表元素中提取比较键