Java——点击上下箭头实现商品排序

本文深入解析了一种商品排序算法的实现细节,通过调整商品的排序码实现上下移动,同时考虑了删除商品对排序的影响,使用递归查询确保排序的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中有时候难免会遇上这种商品排序的需求,当然,别的排序也是一样的原理,如下图

现在给我的要求是做到点击↑就把商品网上移动,点击↓就把商品往下移动,其实原理就是互换位置了,每个商品对应一个sortNum(排序码),展示这个列表的时候是在SQL语句中根据sortNum进行排序,正序或者倒序,思路就是点↑的时候把上下的排序码互换位置,点击↓的原理也是如此

如果仅仅是想实现这样最简单的上下排序那么非常的容易,按照上面这个思路进行操作就行,但是我这个还有别的要求,还需要考虑到删除商品的情况

删除商品会让那个商品对应的sortNum也变成空,这样会在后期的排序中出现问题,所以在你的代码中得做些判断,即使某个排序码后面一位不见了,比如第一个商品排序码是1,后面的商品是2,这个时候如果删除了第二个商品,那么第一个商品后面就变成3了,所以需要加个递归的查询,他后面如果是空,在后面还是空,就需要递归查询直到不为空的时候!

还有注意的地方是第一个商品肯定不能继续网上移动了,最后一个肯定也不能继续往下!

我的代码如下

 @ResponseBody
    @RequestMapping("/sortUp")
    public AjaxResult sortUp(Integer id) {//获取到点击排序的那个商品id
        Goods goods = service.findById(id);//根据id查询到对应的商品
        Integer sortNum = goods.getSortNum();//获取对应的排序码
        Integer integer = Md.selectOne(FIND_SORTFIRST, null, Integer.class);//==select sortNum from t_goods where deleteKey=1 and sortNum is not null order by sortNum
        if(sortNum<=integer){
            return  null;
        }
        if (sortNum > 1) {
            Integer upNum = 1;
            List<Goods> goodsList = this.getList(sortNum-1, false);
            for (Goods g : goodsList) {
                upNum = g.getSortNum();
                g.setSortNum(goods.getSortNum() );
                service.update(g);
            }
            goods.setSortNum(upNum);
            boolean flag = service.update(goods);
            if (flag) {
                return success("操作成功");
            } else {
                return error("操作失败");
            }
        } else {
            return error("此商品不能往上移动!");
        }
    }
    @ResponseBody
    @RequestMapping("/sortDown")
    public AjaxResult sortDown(Integer id) {//获取到点击排序的那个商品id
        Goods goods = service.findById(id);
        Integer integer = Md.selectOne(FIND_SORT, null, Integer.class);//==select sortNum from t_goods where deleteKey=1 and sortNum is not null order by sortNum desc
        Integer sortNum = goods.getSortNum();
        if (sortNum < 0) {
            return null;
        }
        if(sortNum>=integer){
            return null;
        }
        Integer dowmSortNum = 1;
        List<Goods> goodsList = this.getList(sortNum + 1, true);
        for (Goods g : goodsList) {
            dowmSortNum = g.getSortNum();
            g.setSortNum(goods.getSortNum());
            service.update(g);
        }
        goods.setSortNum(dowmSortNum);
        boolean flag = service.update(goods);
        if (flag) {
            return success("操作成功");
        } else {
            return error("操作失败");
        }
    }
    public List<Goods> getList(Integer dowmSortNum, boolean f) {
        List<Goods> goodsList = service.findBy("sortNum=#{sortNum} and deleteKey=1", getData("sortNum", dowmSortNum));//deletKey=1代表有效的数据,sortNum是排序的号码
        if (dowmSortNum == 0) {
            return null;
        }
        if (goodsList == null || goodsList.size() == 0) {
            if (f) {
                dowmSortNum = dowmSortNum + 1;
            } else {
                dowmSortNum = dowmSortNum - 1;
            }
            return this.getList(dowmSortNum, f);
        }
        return goodsList;
    }

具体的还是要根据实际情况来判断!

<think>首先,用户的问题是:“我想询问Java编程语言中是否存在右箭头语法 请问Java中是否支持右箭头语法”。翻译成英文是:I want to ask if there is a right arrow syntax in the Java programming language. Does Java support right arrow syntax? 从系统级指令中,我需要使用中文回答,并遵循所有格式要求。用户的问题是关于Java中是否支持右箭头语法。 回顾提供的引用: - 引用[1]:Java 中的箭头运算符用于形成 lambda 表达式。它将参数与表达式主体分开。例如:(parameter) -> {statement;}; // Lambda expression having arrow - 引用[2]:Java 箭头语法,箭头运算符'->'在Java中做什么?。提到IntelliJ 12支持Java 8的lambdas。 - 引用[3]:Java 箭头语法,使用带箭头键的按键。但内容似乎与键盘事件相关,而不是语法。 - 引用[4]:Java中的箭头——Lambda表达式。给出了一些例子,如() -> 5, x -> 2 * x等。 引用[1]、[2]和[4]都指向箭头运算符(->)在Java中用于lambda表达式。引用[3]是关于键盘事件的,可能不相关。 所以,Java中的箭头语法指的是lambda表达式中的->运算符。 用户问的是“右箭头语法”,在上下文中,很可能指的是->运算符,因为它是向右的箭头。 在Java中,从Java 8开始,确实支持->运算符作为lambda表达式的一部分。lambda表达式用于函数式编程,简化匿名内部类。 例如: - (a, b) -> a + b // 一个简单的lambda表达式 因此,回答应该是:是的,Java支持右箭头语法,具体是在lambda表达式中。 现在,构建回答结构: 1. **清晰回答问题**:直接确认Java是否支持右箭头语法。 2. **解释语法**:简要解释什么是右箭头语法,即lambda表达式的运算符。 3. **提供例子**:使用代码块来展示lambda表达式的使用。根据指令,代码块应该使用适当的格式。 4. **添加引用**:根据指令,在引用的段落末尾自然地添加引用标识。例如,引用来源[1]或[4]。 5. **生成相关问题**:在回答结束后,添加一个“相关问题”部分,列出几个相关问题。 回答结构: - 开头直接回答。 - 解释lambda表达式和->运算符。 - 给出代码示例。 - 结尾添加相关问题。 确保使用中文。 相关问题应该基于主题生成。主题是Java中的箭头语法或lambda表达式。例如: 1. Java lambda表达式的基本用法? 2. 如何在Java中使用函数式接口? 3. Java中lambda表达式的优势? 4. 与匿名内部类的比较? 最后,添加引用标识。引用来自提供的列表,所以我应该引用[1]或[4],因为它们直接相关。 回答内容: - 是的,Java支持右箭头语法,具体是在lambda表达式中,使用->运算符。 - 解释:从Java 8开始引入,用于简化函数式编程。 - 例子:使用代码块展示lambda表达式。 例如: ```java // 示例lambda表达式 Runnable r = () -> System.out.println("Hello, World!"); Comparator<Integer> comp = (a, b) -> a - b; ``` - 引用:在解释时添加,如“Java中的箭头运算符用于形成lambda表达式[^1]”。 相关问题: 1. Java lambda表达式如何与函数式接口一起使用? 2. 什么是Java中的方法引用? 3. Java 8引入了哪些新特性?</think>是的,Java 编程语言支持右箭头语法,具体体现在 **lambda 表达式** 中。右箭头运算符 `->` 是 Java 8 引入的关键特性,用于简化函数式编程,它将 lambda 表达式的参数与表达式主体分开[^1]。下面我将逐步解释并给出示例,确保回答清晰可靠。 ### 1. **右箭头语法的基本概念** - 在 Java 中,右箭头 `->` 不是独立的“语法”,而是 lambda 表达式的核心运算符。 - 它允许以简洁的方式定义匿名函数,常用于实现函数式接口(如 `Runnable`、`Comparator` 等)。 - 语法格式为:`(参数列表) -> { 表达式或代码块 }`。如果主体是单行表达式,可以省略大括号 `{}`。 - 例如,`x -> x * 2` 表示一个函数,输入为 `x`,输出为 `x` 的两倍[^4]。 ### 2. **代码示例** 以下是一个简单的 Java 程序,展示右箭头运算符 `->` 在 lambda 表达式中的使用: ```java import java.util.Arrays; import java.util.List; import java.util.function.Consumer; public class LambdaExample { public static void main(String[] args) { // 示例1: 使用 -> 简化迭代 List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach(name -> System.out.println(name)); // 右箭头用于 Consumer 接口 // 示例2: 使用 -> 实现自定义比较 List<Integer> numbers = Arrays.asList(3, 1, 4, 2); numbers.sort((a, b) -> a - b); // 右箭头用于 Comparator 接口 System.out.println("Sorted numbers: " + numbers); // 示例3: 多参数 lambda 表达式 Runnable task = () -> System.out.println("Task executed!"); // 无参数 new Thread(task).start(); } } ``` - **解释**: - 在 `forEach` 方法中,`name -> System.out.println(name)` 等价于匿名内部类,但更简洁。 - 在 `sort` 方法中,`(a, b) -> a - b` 定义了一个比较器,用于排序数字。 - 运行此代码,输出将是列表元素打印和排序后的数字列表。 - **注意**:lambda 表达式需要目标类型为函数式接口(只有一个抽象方法的接口),否则会编译错误。 ### 3. **支持版本和限制** - **支持版本**:Java 8 及以上版本支持右箭头语法。在早期 Java 版本(如 Java 7 或更低)中,不支持此语法,需要使用匿名内部类替代。 - **常见用途**:lambda 表达式广泛应用于集合操作、事件处理、并行编程等场景,能提升代码可读性和性能[^1][^4]。 - **限制**:lambda 表达式不能独立存在,必须赋值给函数式接口变量或作为方法参数。例如,不能直接写 `-> 5`,而需结合接口如 `Supplier<Integer> supplier = () -> 5;`。 ### 4. **与键盘事件的区分** 用户提到的“右箭头语法”可能被误解为键盘事件(如键盘方向键),但这不是 Java 语法的范畴。Java 中的键盘事件处理使用 `KeyListener` 或 `KeyEvent` 类,例如监听右箭头键: ```java // 键盘事件示例(与 lambda 无关) import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; public class KeyExample extends JFrame { public KeyExample() { addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_RIGHT) { System.out.println("Right arrow key pressed!"); } } }); setSize(200, 200); setVisible(true); } } ``` - 这里,`VK_RIGHT` 表示物理键盘的右箭头键,但这不是语法意义上的“右箭头”[^3]。 ### 总结 Java 确实支持右箭头语法 `->`,但仅限于 lambda 表达式中,从 Java 8 开始引入。它通过简化函数式编程,提高了代码的简洁性和可维护性[^1][^4]。如果您使用的是 Java 8+,可以安全地在 lambda 中应用此运算符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值