每次使用带有不同排序属性的compareTo()方法

时间:2019-04-25 19:38:43

标签: java android sorting arraylist

我正在使用方法<% include partials/header.ejs %> <% if (colours.length > 0) {%> <ul> <% colours.forEach((colour, index) => { %> <li><a href="/colour/<%= colour.id %>"><%= colour.name %></li> <a href="/remove">DEL</a></li> <% }) %> </ul> <% } else { %> <p class="text-center">No colours found</p> <% } %> <p><a href="/add-colour">Add New Color</a></p> <% include partials/footer.ejs %> /////////////////////////////////////////////////////////////////// js const express = require('express'); const router = express.Router(); const mysql = require('mysql'); const app = express(); const bodyParser = require('body-parser'); app.use(express.static('public')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); var connection = mysql.createConnection({ user : 'root', password : 'root', host: 'localhost', port: 3306, // socketPath : '/Applications/MAMP/tmp/mysql/mysql.sock', database : 'js', }); connection.connect((err) => { if (err) { throw err; } console.log('Connected to database'); }); global.connection = connection; router.get('/',function(req,res){ let query = "SELECT * FROM colours ORDER BY id ASC"; connection.query(query, (err, result) => { if (err) { throw err; } res.render('index.ejs', { colours: result }); }); }); //////////////////////////////////////////////////////////// //DELETE FROM `colours` WHERE `colours`.`id` = 3; ////////////////////////////////////////////////////////////////// router.get('/remove',function(req,res){ connection.connect('/remove',function(err) { if (err) throw err; //Delete all customers with the address "Mountain 21": var sql = "DELETE FROM colours WHERE 1"; con.query(sql, function (err, result) { if (err) throw err; console.log("Number of records deleted: " + result.affectedRows); }); }); res.render('index.ejs'); }); router.get('/add-colour',function(req,res){ res.render('add-colour.ejs'); }); router.post('/add-colour-complete',function(req,res){ let query = 'INSERT INTO colours (name) VALUES ("'+req.body.name+'")'; connection.query(query); res.writeHead(302, { 'Location': '/' }); res.end(); }); router.post('/colour/:id',function(req,res){ let query = "SELECT * FROM colours WHERE id = "+req.params.id; connection.query(query, (err, result) => { if (err) { throw err; } res.render('colour.ejs', { colour: result[0] }); }); }); app.use('/', router); app.listen(8080); console.log('Running at Port 8080'); 来排序名为compareTo()的自定义对象的ArrayList,但是在我的应用程序中,有时我需要根据特定属性对数组进行排序,例如image,有时我需要根据对象的另一属性或属性对数组进行排序,但是对于不同的排序,我不能多次重写goodMatches方法。

我已经尝试过使用Object的flags属性,但是问题是其他属性都是float类型的,我需要保留方法compareTo()来返回float而不是compareTo的整数。任何人都可以帮助我克服这个问题而无需创建另一个对象类吗,任何帮助将不胜感激,以下是我的goodMatches代码:

compareTo()

2 个答案:

答案 0 :(得分:1)

给出以下Image类(使用大写的类名)

class Image {
    private int goodMatches;
    private float anotherProperty;

    .....

    public int getGoodMatches() {
        return goodMatches;
    }

    public float getAnotherProperty() {
        return anotherProperty;
    }
}

您可以为每个属性创建一个Comparator

class GoodMatchesComparator implements Comparator<Image> {
    @Override
    public int compare(Image i1, Image i2) {
        return Integer.compare(i1.getGoodMatches(), i2.getGoodMatches());
    }
}

class AnotherPropertyComparator implements Comparator<Image> {
    @Override
    public int compare(Image i1, Image i2) {
        return Float.compare(i1.getAnotherProperty(), i2.getAnotherProperty());
    }
}

然后使用“列表”上的sort方法对列表进行排序:

List<Image> images = new ArrayList<>();
// populate your list

// sort the list based on the goodMatches property
images.sort(new GoodMatchesComparator());

// sort the list based on the anotherProperty property
images.sort(new AnotherPropertyComparator());

如果您需要逆序订购,可以按照以下方式进行操作:

images.sort(new GoodMatchesComparator().reversed());

答案 1 :(得分:0)

通过传递ICompare的实现,而不是重写compareTo(),而是尝试创建一个名为Comparator的类,该类创建一个比较器(确定哪个对象具有更高优先级的判断器)。

public interface ICompare{
   compare(image obj1, image obj2);
}

Comperator类:

public class Comperator{
   ICompare icompare;
   Comperator(ICompare icompare){
      this.icompare = icompare;
   }

   public int compare(image img1, image img2){
      return icompare.compare(img1,img2);
   }
}

最后,通过传递所需的已实现接口来创建所需的Comperator对象。然后使用它来比较图像类型的对象。

我想在这里告诉您,您可以在此处使用泛型,但我不仅仅是因为我想保持其简单明了!