把 List 分割成每份pageSize大小的 List 并放入 List>

方法一:

可以使用 List 的 List<E> subList(int fromIndex, int toIndex)  方法来截取一段段List 但是 subList 方法取得的是 List 的一个视图。这种方法并不可以用于需要切分再使用切分后的List。之前就尝试把过把切分后的List,加入到缓存当中,出现不能序列化的错误。但是这种方法还是比较容易明白的。

public static <T> List<List<T>> split2List2(List<T> list, int pageSize) {

		int listSize = list.size();
		int page = (listSize + (pageSize - 1)) / pageSize;

		List<List<T>> listArray = new ArrayList<List<T>>();
		int fromIndex = 0;
		int toIndex = 0;
		for (int i = 1; i < page; i++) {
			toIndex = i * pageSize;
			List<T> subList = list.subList(fromIndex, toIndex);
			fromIndex = toIndex;
			listArray.add(subList);
		}
		listArray.add(list.subList(fromIndex, listSize));
		return listArray;
	}



 方法二:

由于方法一造成的问题,所以修改成方法二,这样分割到的就不是一个个视图了,而是实实在在的 List<T>。

public static <T> List<List<T>> split2List3(List<T> list, int pageSize) {

		int listSize = list.size();
		int page = (listSize + (pageSize - 1)) / pageSize;

		List<List<T>> listArray = new ArrayList<List<T>>();
		int fromIndex = 0;
		int toIndex = 0;
		for (int i = 1; i < page; i++) {
			toIndex = i * pageSize;
			List<T> subList = subList(list,fromIndex,toIndex);
			fromIndex = toIndex;
			listArray.add(subList);
		}
		listArray.add(subList(list,fromIndex,listSize));
		return listArray;
	}

	private static <T> List<T> subList(List<T> list, int fromIndex, int toIndex) {
		List<T> subList = new ArrayList<T>();
		for (int i = fromIndex; i < toIndex; i++) {
			subList.add(list.get(i));
		}
		return subList;
	}



方法三:

这个方法是在网上找到的一种方法,它分割到的也是实实在在的List<T>,但是效率上不如方法二

public static <T> List<List<T>> split2List(List<T> list, int pageSize) {

		int listSize = list.size(); // list的大小
		int page = (listSize + (pageSize - 1)) / pageSize; // 页数

		List<List<T>> listArray = new ArrayList<List<T>>(); // 创建list数组
															// ,用来保存分割后的list
		for (int i = 0; i < page; i++) { // 按照数组大小遍历
			List<T> subList = new ArrayList<T>(); // 数组每一位放入一个分割后的list
			for (int j = 0; j < listSize; j++) { // 遍历待分割的list
				int pageIndex = ((j + 1) + (pageSize - 1)) / pageSize; // 当前记录的页码(第几页)
				if (pageIndex == (i + 1)) { // 当前记录的页码等于要放入的页码时
					subList.add(list.get(j)); // 放入list中的元素到分割后的list(subList)
				}

				if ((j + 1) == ((i + 1) * pageSize)) { // 当放满一页时退出当前循环
					break;
				}
			}
			listArray.add(subList); // 将分割后的list放入对应的数组的位中
		}
		return listArray;
	}



下面是测试方法:

public static void main(String[] s) {
		new Thread(){
			public void run(){
				long begin = System.currentTimeMillis();

				List<String> strlist = new ArrayList<String>();
				for (int i = 0; i < 120000; i++) {
					strlist.add("" + (i + 1));
				}
				List<List<String>> list = split2List(strlist, 19);

				int index = 1;

				for (List<String> strlist2 : list) {
					System.out.println(index++);
					System.out.println("----------------------------------");
					for (String str : strlist2) {
						System.out.print(str + "\t");
					}
					System.out.println("END");
					System.out.println();
				}
				System.out.println("time: " + (System.currentTimeMillis() - begin));
			}
		}.start();

		new Thread(){
			public void run(){
				long begin = System.currentTimeMillis();

				List<String> strlist = new ArrayList<String>();
				for (int i = 0; i < 12000; i++) {
					strlist.add("" + (i + 1));
				}
				List<List<String>> list = split2List3(strlist, 19);

				int index = 1;

				for (List<String> strlist2 : list) {
					System.out.println(index++);
					System.out.println("----------------------------------");
					for (String str : strlist2) {
						System.out.print(str + "\t");
					}
					System.out.println("END");
					System.out.println();
				}
				System.out.println("time3: " + (System.currentTimeMillis() - begin));
			}
		}.start();
		
	}



运行一下就知道其效率了。

你可能感兴趣的:(java,分割,List)