java根据图片中绿色像素点的多少进行排序

前言

一个朋友被绿了,看见绿色就会很伤感,作为好兄弟的我当然看不下去,感觉有我必要也必须做一点什么。正好我又在写java程序,那就写一个小程序帮他把电脑里的图片排一下顺序,根据绿色的程度进行排序,最后把排好序的图片偷偷的放到他的电脑里去。为了好兄弟做这么多的事情,正所谓:事了拂衣去,功藏身与名啊!(当然是倒序排的)

一、利用for循环读取图片

相信学过图像处理的小伙伴都知道,一张图片由很多像素组成(当然,矢量图片除外,大家下来可以了解为啥矢量图片不是由像素点组成的)。因此,不管是什么图片我们都看作是一个平面,因为就可以用坐标的方式去读取图片啦!那就废话不多说直接开始!

二、代码的逻辑

1.先给大家看看主方法里面都有一些什么内容

public static void main(String[] args) {
		HashMap<File, Object> imageMap = new HashMap<File, Object>();//用hashMap将文件和对应的像素点数量装到一起
		File fileDir = new File("D:\\Download\\TestFile");//将要进行排序的文件目录
		File[] listFiles = fileDir.listFiles();
		for (File readFile : listFiles) {
			getImagePixel(readFile, imageMap);//获取图片的绿色像素点数量的多少
		}

		HashMapSortUtils hashMapSortUtils = new HashMapSortUtils(imageMap, 1, 3, "Mus");
		LinkedHashMap<File,Object> sortFileMap = hashMapSortUtils.sortFileMap();//将图片按照像素点的数量进行排序
		hashMapSortUtils.renameFiles(sortFileMap);//将排好序的文件重命名(不然离开控制台就看不到文件的排序了>o<)

		System.out.println(imageMap);//这里只是用来看具体像素点有多少的,并没有实际的意义
	}

是不是很简单呢?跟大象装冰箱一样,只有三个步骤:
1.将文件目录下的所有图片含有的绿色像素点全部读取出来,然后将对应的文件名和像素点个数暂存在HashMap里;
2.将图片根据绿色像素点的多少进行排序;
3.将排好序的图片重命名,然后进行排序输出(Tips:文件会进行重命名的,所有不要直接在源文件上直接玩喔,注意文件的备份);

好了,那我们就直接开始看每个方法具体是怎样实现的吧,按顺序进行讲解!(以下大家就注意看代码中的注释了,不再做重复的解释了)

2.读取图片像素点的方法

private static HashMap<File, Object> getImagePixel(File readFile, HashMap<File, Object> imageMap) {
		int red = 0;//记录像素点的红色
		int green = 0;//记录像素点的绿色
		int blue = 0;//记录像素点的蓝色
		int counter = 0;//程序计数器

		BufferedImage bi = null;
		try {
			bi = ImageIO.read(readFile);//通过ImageIO来读取图片,以便获取图片的RGB信息
		} catch (IOException e) {
			e.printStackTrace();
		}

		int width = bi.getWidth();//获取图片的宽度
		int height = bi.getHeight();//获取图片的高度
		int minx = bi.getMinX();//获取图片的坐标起点x轴
		int miny = bi.getMinY();//获取图片的坐标起点y轴

		for(int i = minx; i < width; i++){
			for(int j = miny; j < height; j++){
				int pixel = bi.getRGB(i, j);
				red = (pixel & 0xff0000) >> 16;//过滤掉图片的绿色和蓝色
				green = (pixel & 0xff00) >> 8;//过滤掉图片的绿色
				blue = (pixel & 0xff);//最后剩下的就是蓝色啦

				if(green - red > 30 && green - blue > 30){//绿色的范围
					counter++;
				}
			}
		}
		imageMap.put(readFile, counter);//将文件和像素点的个数记录到HashMap中

		return imageMap;
	}

3.将图片按照像素点的数量进行排序

由于排序不光在这里可以使用,在其他情况下也可能会使用到(比如说根据文件的创建时间进行排序,都可以用到排序的)。所以我将排序写成了一个抽象类,其他情况下只需要继承这个抽象类,然后具体实现自己想要实现的方法就行了!具体的现如下:

抽象类:

package readcolor;

import java.io.File;
import java.util.HashMap;
import java.util.LinkedHashMap;

public abstract class HashMapSortUtil {
	private HashMap<File, Object> sortMap;//全局变量Map,就是主方法需要传过来进行排序的Map
	private String prefix;//前缀,用来命名自己的文件 ==> Mus

	public abstract LinkedHashMap<File, Object> sortFileMap();//进行排序的方法

	public abstract void renameFiles(LinkedHashMap<File, Object> linkedTimeMap);//重命名的方法

	public HashMap<File, Object> getSortMap() {
		return sortMap;
	}

	public void setSortMap(HashMap<File, Object> sortMap) {
		this.sortMap = sortMap;
	}

	public String getPrefix() {
		return prefix;
	}

	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}
}

子类:

package readcolor;

import java.io.File;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map.Entry;
import java.util.Set;

public class HashMapSortUtils extends HashMapSortUtil{
	private int counter;//计数器,默认从多少开始进行命名 ==> 1
	private int nameLength;//命名的长度,其实就是计数器之前需要添加几个0 ==> 3
	private int nameExpansion = 0;//记录名字超长了需要进行扩容的次数
	//prefix(在父类里面),counter,nameLength组成的结果就是对应的Mus001
	private HashMap<File, File> tempFileMap = new HashMap<File, File>();//记录在进行重命名时,目标文件有重复时,将源文件拷贝出来与将要命名的名字记录到HashMap里面

	public HashMapSortUtils() {//构造方法
		super();
	}

	public HashMapSortUtils(HashMap<File, Object> sortMap, Integer counter, Integer nameLength, String prefix) {//构造方法
		super();
		super.setSortMap(sortMap);
		super.setPrefix(prefix);
		this.counter = counter;
		this.nameLength = nameLength;
	}

	/**
	 * 将图片按照像素点个数进行排序的方法
	 * 参数:无
	 * 返回值:无
	 * */
	@Override
	public LinkedHashMap<File, Object> sortFileMap() {
		LinkedHashMap<File,Object> linkedHashMap = new LinkedHashMap<File, Object>();
		Set<Entry<File, Object>> mapEntries = super.getSortMap().entrySet();//将传进来需要进行排序的HashMap获取到每个节点
		LinkedList<Entry<File, Object>> timeList = new LinkedList<Entry<File, Object>>(mapEntries);//将每个节点放到List集合中,方便利用Collections的方法进行排序
		Collections.sort(timeList, new Comparator<Entry<File, Object>>() {//利用Comparator接口进行排序

			@Override
			public int compare(Entry<File, Object> o1, Entry<File, Object> o2) {
				if(o1.getValue() == o2.getValue()){//如果两个文件的绿色像素点相同,就用文件的名字进行比较
					return o2.getKey().compareTo(o1.getKey());
				}
				return ((Integer) o2.getValue()).compareTo((Integer)o1.getValue());//利用文件的绿色像素点进行比较
			}
		});

		for (Entry<File, Object> entry : timeList) {//将排好序之后的文件放到LinkedHashMap中,因为如果方法HashMap中的话,你会发现它的顺序又是乱的了-o-
			linkedHashMap.put(entry.getKey(), entry.getValue());
		}
		return linkedHashMap;
	}

	/**
	 * 重命名文件的方法
	 * 参数:linkedTimeMap:需要进行文件重命名的HashMap
	 * 返回值:无
	 * */

	@Override
	public void renameFiles(LinkedHashMap<File, Object> linkedTimeMap) {
		Set<Entry<File,Object>> entrySet = linkedTimeMap.entrySet();
		for (Entry<File, Object> entry : entrySet) {
			renameFile(entry.getKey(), createFileName(entry.getKey())/*根据之前设置文件的名字(counter、nameLength、prefix)生成文件名*/);//重命名文件
		}
		//最后重命名剩下的源文件的备份文件
		renameTempFiles();
	}

	/**
	 * 根据之前设置文件的名字(counter、nameLength、prefix)生成文件名
	 * 参数:oldFile:源文件
	 * 返回值:生成名字之后的文件
	 * */
	private File createFileName(File oldFile) {
		//通过父类获取到prefix
		String prefix = super.getPrefix();
		//获取结束
		String newFileName = "";
		newFileName += prefix;//先将前缀拼接上
		int nameLen = String.valueOf(counter).length();//获取计数器的长度
		if(nameLen > nameLength){//如果计数器超长了,那么命名的长度(nameLength)就需要进行扩容,不然会出现文件名重复的情况
			nameLength++;
			nameExpansion++;//这里记录是因为,当后面的操作出现错误时,这里可能需要将原来的长度进行恢复
		}

		if(nameLen <= nameLength){
			int d_Value = String.valueOf(Math.pow(10, nameLength) - 1).length() - String.valueOf(counter).length() - 2;//计算需要填补的0的个数,这里减2是因为去除double数据后面的.0
			for (int i = 0; i < d_Value; i++) {
				newFileName += "0";
			}
		}
		newFileName += counter;//将计数器添加到名字上

		String oldFileName = oldFile.getName();//获取源文件的名字
		String dirName = oldFile.getParentFile().getAbsolutePath();//获取源文件的上级文件夹的路径
		File newFile = new File(dirName + File.separator + newFileName + oldFileName.substring(oldFileName.lastIndexOf(".")));//利用新的文件名生成文件
		counter++;//计数器需要进行+1
		return newFile;
	}

	/**
	 * 将源文件重命名为新文件的名字
	 * 参数:oldFile:源文件, newFile:新文件
	 * 返回值:无
	 * */
	private void renameFile(File oldFile, File newFile) {
		//=================如果源文件和新文件都存在,并且源文件和新文件的名字不相同,那么就需要将源文件备份处理,等其他文件重命名完之后再执行这类文件的重命名操作=================
		if(oldFile.exists() && oldFile.isFile() && newFile.exists() && newFile.isFile()){
			if(!newFile.getName().equals(oldFile.getName())){
				//===============================将源文件做备份处理===============================
				File oldFileTemp = null;
				int fileTempCounter = 0;
				//使用do...while...循环确保暂存文件中没有重复的名字
				do{
					oldFileTemp = new File(oldFile.getAbsolutePath() + fileTempCounter + System.currentTimeMillis());
					fileTempCounter++;
				}while(oldFileTemp.exists() && oldFileTemp.isFile());

				//将源文件的内容复制到备份文件中
				try{
					new FileServiceImpl().copyFile(oldFile, oldFileTemp);
				}catch (Exception e){
					e.printStackTrace();
				}
				//删除源文件
				oldFile.delete();
				//将源文件的备份文件和源文件需要重命名的名字记录到HashMap里面,最后进行这部分文件的命名操作
				tempFileMap.put(oldFileTemp, newFile);
				return;
			}
		}

		//如果目标文件不存在或者目标文件名与源文件名相同,就直接进行重命名的操作
		if(oldFile.exists() && oldFile.isFile()){
			if(oldFile.renameTo(newFile)){
				System.out.println("重命名成功:" + oldFile.getAbsolutePath() + "==>" + newFile.getAbsolutePath());
				return;
			}
		}

		//重命名失败就将计数器减一,并且将命名的长度还原到原来的长度
		System.out.println("====================================重命名失败:" + oldFile.getAbsolutePath() + "====================================");
		counter--;
		nameLength -= nameExpansion;
	}

	/**
	 * 重命名剩下的源文件的备份文件
	 * 参数:无
	 * 返回值:无
	 * */
	private void renameTempFiles() {
		Set<Entry<File, File>> entrySet = tempFileMap.entrySet();
		for (Entry<File, File> entry : entrySet) {
			//调用重命名的方法进行重命名
			renameFile(entry.getKey(), entry.getValue());
		}
	}

	public int getCounter() {
		return counter;
	}

	public void setCounter(int counter) {
		this.counter = counter;
	}

	public int getNameLength() {
		return nameLength;
	}

	public void setNameLength(int nameLength) {
		this.nameLength = nameLength;
	}

}

由于counter(计数器)和nameLength(命名的长度)在进行排序和文件重命名的时候会频繁的使用到,因此我把他们放到了子类里面,避免多次调用父类的getter和setter方法。虽然我代码里面注释写得很清楚,但是还是有一些小伙伴不习惯看注释,那我稍微做一下解释,但是代码的逻辑还是要大家下来看一下!如果在博客上不太方便的话,可以直接copy到eclipse里面或者idea里面进行逻辑的分析!

(1)在主方法或其他方法需要调用到这个类型,可以直接利用该类的构造方法来调用到这个类:

public HashMapSortUtils(HashMap<File, Object> sortMap, Integer counter, Integer nameLength, String prefix){
	......
}

这个构造方法会将需要进行排序和重命名的HashMap加载到该类的成员变量中,该类所有方法都可以调用该HashMap,并且计数器开始的位置(counter)、命名的长度(nameLength)、命名前缀(prefix)都加载到成员变量中,其中HashMap和前缀属于父类的变量。(相信大多数人都知道,我就乱解释一番了。。。)
(2)将传进来的HashMap进行排序的方法:

public LinkedHashMap<File, Object> sortFileMap() {
	......
}

该方法就是利用java工具类Collections下面的sort方法进行排序,需要注意的是,最后之所以返回的是一个LinkedHashMap是因为HashMap是无序的,如果排完序还是用HashMap装排序的结果,那么就有可能没有达到排序预期的效果

(3)将排好序的HashMap中的文件重命名的方法:

public void renameFiles(LinkedHashMap<File, Object> linkedTimeMap) {
	......
}

该方法主要分为两个步骤:a.利用createFileName方法将之前设置好的prefix(前缀)、nameLength(命名的长度)、counter(计数器)组成新的名字;b.将HashMap中所有的entry节点利用renameFile方法进行判断是否可以直接重命名,如果可以直接重命名就直接重命名,如果需要重新命名的文件已经存在就将源文件copy一份出来,然后将拷贝文件和新的名字方法一个HashMap中,等到程序的第c步才执行这部分文件的重命名!c.将之前未进行重命名的源文件进利用renameTempFiles方法行统一的重命名!

4.文件操作的工具类

文件操作是一个公共的类,进行文件的复制、删除、获取所有文件、创建文件夹等等,都可以写做一个公共的方法,大家可以自行去了解这个类的作用,这里不再过多的赘述(嘻嘻,又可以偷波懒了),不过我这里是错误的示范,我用接口的方式来实现的,真正的生产中是不会这样做的,因为文件操作是基本上不会变的,这里我只是想单纯的联系一下接口的操做,那么废话不多说,直接上代码,都是文件操作的基础代码:

文件操作的接口:

package readcolor;

import java.io.File;
import java.util.List;

public interface FileService {
	void copyFile(String sourcePath, String targetPath) throws Exception;

	void copyFile(File sourceFile, File targetFile) throws Exception;

	void mkDirs(String path) throws Exception;

	List<File> getAllFiles(String sourcePath);

	void removeFiles(String path);

	void removeFiles(File sourceFile);
}

文件操作的实现类:

package readcolor;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

public class FileServiceImpl implements FileService{

	@Override
	public void copyFile(String sourcePath, String targetPath) throws Exception {
		copyFile(new File(sourcePath), new File(targetPath));

	}

	@Override
	public void copyFile(File sourceFile, File targetFile) throws Exception {
		FileInputStream fis = new FileInputStream(sourceFile);
		FileOutputStream fos = new FileOutputStream(targetFile);

		byte[] buffer = new byte[1024];
		int len = 0;

		while((len = fis.read(buffer)) != -1){
			fos.write(buffer, 0, len);
			fos.flush();
		}

		fos.close();
		fis.close();
	}

	@Override
	public void mkDirs(String path) throws Exception {
		File destFile = new File(path);
		if(!destFile.exists()){
			destFile.mkdirs();
		}
	}

	@Override
	public List<File> getAllFiles(String sourcePath) {
		ArrayList<File> files = new ArrayList<File>();
		File file = new File(sourcePath);
		if(file.exists() && !file.isHidden()){
			if(file.isFile()){
				files.add(file);
			}

			if(file.isDirectory()){
				File[] fs = file.listFiles();
				for (File f : fs) {
					if(!f.isHidden()){
						if(f.isFile()){
							files.add(file);
						}

						if(f.isDirectory()){
							files.addAll(getAllFiles(sourcePath + File.separator + f.getName()));
						}
					}
				}
			}
		}
		return files;
	}

	@Override
	public void removeFiles(String path) {
		removeFiles(new File(path));
	}

	@Override
	public void removeFiles(File sourceFile) {
		if (!sourceFile.isDirectory()){
			if(sourceFile.delete()) System.out.println("删除文件:" + sourceFile.getAbsolutePath() + "成功");
		}else{
			File[] files = sourceFile.listFiles();

			for (File file : files) {
				if(file.isDirectory()){
					removeFiles(file);
					if(file.delete()) System.out.println("删除文件夹:" + file.getAbsolutePath() + "成功");
				}else{
					if(file.delete()) System.out.println("删除文件:" + file.getAbsolutePath() + "成功");
				}
			}
		}
	}
}

好的,一切准备就绪,那我们直接开始运行代码,看看效果如何:

先准备好图片:

然后设置好文件的路径:

运行java程序:

可以看到所有的文件都已经重新排序,并且已经进行重命名了,看看实际的效果:

是不是感觉前面的图片要稍微绿一点呢?该程序可以进行重复执行的,暂时没有出现命名失败的情况,如果有小伙伴试了然后报错了,记得留言喔,我看看是啥问题,然后看看能不能再优化一下。。。(闻到了头发掉落的气息)

总结

最后,我们可以稍微改动几行代码,然后将所有的图片只输出绿色像素点来做一个直观的感受:

package readcolor;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;

import javax.imageio.ImageIO;

public class ReadColor {
	private static int count = 0;
	public static void main(String[] args) {
		HashMap<File, Object> imageMap = new HashMap<File, Object>();//用hashMap将文件和对应的像素点数量装到一起
		File fileDir = new File("D:\\Download\\TestFile");//将要进行排序的文件目录
		File[] listFiles = fileDir.listFiles();
		for (File readFile : listFiles) {
			getImagePixel(readFile, imageMap);//获取图片的绿色像素点数量的多少
		}

		HashMapSortUtils hashMapSortUtils = new HashMapSortUtils(imageMap, 1, 3, "Mus");
		LinkedHashMap<File,Object> sortFileMap = hashMapSortUtils.sortFileMap();//将图片按照像素点的数量进行排序
		hashMapSortUtils.renameFiles(sortFileMap);//将排好序的文件重命名(不然离开控制台就看不到文件的排序了>o<)

		System.out.println(imageMap);
	}

	private static HashMap<File, Object> getImagePixel(File readFile, HashMap<File, Object> imageMap) {
		int red = 0;//记录像素点的红色
		int green = 0;//记录像素点的绿色
		int blue = 0;//记录像素点的蓝色
		int counter = 0;//程序计数器

		BufferedImage bi = null;
		try {
			bi = ImageIO.read(readFile);//通过ImageIO来读取图片,以便获取图片的RGB信息
		} catch (IOException e) {
			e.printStackTrace();
		}

		int width = bi.getWidth();//获取图片的宽度
		int height = bi.getHeight();//获取图片的高度
		int minx = bi.getMinX();//获取图片的坐标起点x轴
		int miny = bi.getMinY();//获取图片的坐标起点y轴

		for(int i = minx; i < width; i++){
			for(int j = miny; j < height; j++){
				int pixel = bi.getRGB(i, j);
				red = (pixel & 0xff0000) >> 16;//过滤掉图片的绿色和蓝色
				green = (pixel & 0xff00) >> 8;//过滤掉图片的绿色
				blue = (pixel & 0xff);//最后剩下的就是蓝色啦

				if(green - red > 30 && green - blue > 30){//绿色的范围
					counter++;
				}else{
					bi.setRGB(i, j, 0xffffff);
				}
			}
		}
		imageMap.put(readFile, counter);//将文件和像素点的个数记录到HashMap中

		try {
			ImageIO.write(bi, "jpg", new File("D:\\Download\\TestFile1\\" + count +".jpg"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		count++;
		return imageMap;
	}
}

将图片的非绿色像素点修改为白色,然后存到一个新的文件夹里,看看是什么效果:

是不是只提取出了绿色像素点呢,大家在这个的基础上就可以选择自己喜欢的颜色进行排序了。反正我把这个程序送给我朋友的时候,遭到了他半个小时的感谢(问候),大家只是自己可以玩一玩,千万别去乱动别人的硬盘喔!(最后的最后,程序并没有什么实际的使用价值,只是学习了一些新的方法或者技巧,实际上我进行图像处理的时候都是直接选用photoshop进行操作的,哈哈啊哈哈!)

到此这篇关于java根据图片中绿色像素点的多少进行排序的文章就介绍到这了,更多相关java绿色像素点排序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java简单获取字符串像素的方法

    本文实例讲述了Java简单获取字符串像素的方法.分享给大家供大家参考,具体如下: 计算字符串的像素长度与高度: Graphics2D g = (Graphics2D)Toolkit.getDefaultToolkit(). getImage("imgname").getGraphics(); // 设置大字体 Font font = new Font("楷体", Font.ITALIC | Font.BOLD, 72); g.setFont(font); FontR

  • java编程简单获取图片像素的方法

    本文实例讲述了java获取图片像素的方法.分享给大家供大家参考,具体如下: package cn.net.comsys.sso; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.io.*; public class Test { public static void main(String args[]) { File file = new File("a.bmp"); Buf

  • java根据图片中绿色像素点的多少进行排序

    前言 一个朋友被绿了,看见绿色就会很伤感,作为好兄弟的我当然看不下去,感觉有我必要也必须做一点什么.正好我又在写java程序,那就写一个小程序帮他把电脑里的图片排一下顺序,根据绿色的程度进行排序,最后把排好序的图片偷偷的放到他的电脑里去.为了好兄弟做这么多的事情,正所谓:事了拂衣去,功藏身与名啊!(当然是倒序排的) 一.利用for循环读取图片 相信学过图像处理的小伙伴都知道,一张图片由很多像素组成(当然,矢量图片除外,大家下来可以了解为啥矢量图片不是由像素点组成的).因此,不管是什么图片我们都看

  • java获取键盘输入的数字,并进行排序的方法

    需求:由键盘输入三个整数分别存入变量num1.num2.num3,对它们进行排序, 并且从小到大输出 要求使用2种方法实现: 一.使用if-else分支结构: 二.使用java内置模块Arrays的排序方法. 一.使用if-else分支结构 class Date19_02 { public static void main(String[] arg){ sortOne(); } public static void sortOne(){ Scanner sc1 = new Scanner(Sys

  • Java实现对字符串中的数值进行排序操作示例

    本文实例讲述了Java实现对字符串中的数值进行排序操作.分享给大家供大家参考,具体如下: 问题: 对"34 9 -7 12 67 25"这个字符串中的数值从小到大排序! 解决方法: 先介绍几个eclipse快捷键:输入for再按下"alt+/"可快速写一个for循环 选中某一个小写单词 Ctrl+Shift+x  可变大写,选中某一个大写单词 Ctrl+Shift+y  可变小写 下面请看具体实现代码: import java.util.Arrays; public

  • Java实现储存对象并按对象某属性排序的几种方法示例

    本文实例讲述了Java实现储存对象并按对象某属性排序的几种方法.分享给大家供大家参考,具体如下: 在编程的时候,经常会出现对某一种类的对象们按照某属性进行自定义的排序,比如:学生对象按照age大小排序. 有一种方法就是把age单独提出来排好序,然后按照ages数组的顺序把students重存一次.但是这样太繁琐了,有没有更好的方法呢? 有滴~ 第一种,可以实现边添加边排序,需要用到TreeSet. 第二种,用数组存放对象们,但是不需单独取出某属性排列好再重存,而是在原数组上用比较器重新排一次序.

  • java接口返回参数按照请求参数进行排序方式

    目录 java接口返回参数按照请求参数进行排序 排序 java通过接口进行排序 描述 知识点 1.Comparable接口 2.Comparator接口 java接口返回参数按照请求参数进行排序 在项目实际开发中可能遇到过这种问题,接口请求参数顺序是[a,b,c],结果返回的数据是[bObject,cObject,aObject],导致这种原因可能是底层采用了设计模式,或者是表拼接查询,本文主要就是为了实现这种功能,采用流的方法 代码实现 import lombok.Data; import j

  • Java实现两个随机数组合并进行排序的方法

    目录 前言: 一.什么是线性表 二.ArrayList集合 三.用线性表的思想排序数组间排序 四.冒泡排序: 前言: ​ 小Du猿结束"996ICP"CRUD开发工作生活,重新进入了校园学习生活.本周开始了第二周数据结构的基础知识学习,大爱向宇老师的上课方式,用生动形象的方式讲解抽象概念,但一开口就是LSP.O(∩_∩)O,向向宇大佬致敬,菜鸡小Du猿投来膜拜的眼光. ​ 此博客用Java实现线性表的思想,实现数组的排序和序列化.序列化的排序方式采用冒泡排序的方式,但小Du猿正在优化该

  • Java 进阶使用 Lambda 表达式实现超强的排序功能

    目录 基于Comparator排序 使用 Lambda 表达式替换Comparator匿名内部类 通过静态方法抽取公共的 Lambda 表达式 借助Comparator的comparing方法 多条件排序 在Stream中进行排序 倒序排列 调转排序判断 在Comparator.comparing中定义排序反转 在Stream中定义排序反转 null 值的判断 元素是 null 的笨拙实现 排序条件的字段是 null 文末总结 我们在系统开发过程中,对数据排序是很常见的场景.一般来说,我们可以采

  • Java 数据结构与算法系列精讲之排序算法

    概述 从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章. 冒泡排序 冒泡排序 (Bubble Sort) 是一种简单的排序算法. 它重复地遍历要排序的数列, 一次比较两个元素, 如果他们的顺序错误就把他们交换过来. 遍历数列的工作是重复地进行直到没有再需要交换, 也就是说该数列已经排序完成. 这个算法的名字由来是因为越小的元素会经由交换慢慢 "浮" 到数列的顶端. 冒泡排序流程: 通过比较相邻的元素, 判断两个元素位置是否需要互换 进行 n-1 次比较,

  • java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序)

    快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来. 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组. 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序. 复制代码 代码如下: package com.firewolf.sort; public class MySort { /**  * @param args  */ public s

  • Java使用Arrays.sort()方法实现给对象排序

    目录 使用Arrays.sort()方法给对象排序 麻烦的方法 Arrays.sort()方法 浅谈Arrays.sort()原理 例子1 基础知识点 例子2 双轴快排 另外参考了其他博文,算法思路如下 使用Arrays.sort()方法给对象排序 当我们给一个整型数组或者浮点型之类的数组排序的时候,很简单就可以达到我们排序的目的,无非是排序算法的问题.那么,如果我们现在想根据对象的一个属性值给一个对象数组进行排序呢? 假如我们现在有一个Car类型,Car类中有一个double型的speed属性

随机推荐