array.sort重新定位读取的消息

问题描述

我为用户提供了一系列对象(聊天),我想将所有包含未读消息的聊天推到列表顶部,而不影响其余聊天位置。

这是我到目前为止所拥有的。每次通过未读消息与hasUnread进行新的聊天时,该聊天都会被推到列表的顶部。 其他所有聊天都将重新安排。

const singleChat = [...Object.values(singles)];
singleChat.sort((a,b) => (a.hasUnread == false ? 1 : -1));

我认为这是因为我需要指定要拉出的索引以及将其推回的索引。

我当时在想这样的事情:Move an array element from one array position to another,但能够破译旧职位似乎有些困惑。

if (new_index >= chat.length) {
  var k = new_index - chat.length + 1;
    while (k--) {
      chat.push(undefined);
    }
}

chat.splice(new_index,chat.splice(old_index,1)[0]);

任何帮助都会很棒。

解决方法

我不得不使用一个循环,虽然有点慢,但这行得通:

import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MouseCoordinatesTitle implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new MouseCoordinatesTitle());
    }
    
    private JFrame frame;
    
    private String title;
    
    public MouseCoordinatesTitle() {
        this.title = "Coordinates: ";
    }

    @Override
    public void run() {
        frame = new JFrame(title);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createMainPanel());
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createMainPanel() {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(600,400));
        panel.addMouseMotionListener(new PositionListener());
        return panel;
    }
    
    public void updateJFrameTitle(Point point) {
        StringBuilder builder = new StringBuilder(title);
        builder.append("X: ");
        builder.append(point.x);
        builder.append(",Y: ");
        builder.append(point.y);
        frame.setTitle(builder.toString());
    }
    
    public class PositionListener implements MouseMotionListener {

        @Override
        public void mouseMoved(MouseEvent event) {
            Point point = event.getPoint();
            updateJFrameTitle(point);
        }

        @Override
        public void mouseDragged(MouseEvent event) {
        
        }

    }

}