程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Java:如何在不使用 Sort() 的情况下基于自定义对象 ArrayList 创建排序字符串 ArrayList

发布于2021-10-08 08:52     阅读(1067)     评论(0)     点赞(29)     收藏(1)


我有一个叫做类Word,其中每个实例有StringArrayList<Character>double假设这个类有 3 个实例。我想创建一个新的ArrayList<String>,其中包含所有 3 个单词字符串。但是,字符串的顺序必须从其原始实例的双打的高到低。该项目的主要规定是Collections.sort不能使用方法。请查看下面的代码,让我知道您是否能想到编写此循环的方法(需要一个循环,因为实际上有 +50,000 个字):


import java.awt.List;
import java.util.ArrayList;
import java.util.Arrays;


public class WordRecommender {

    String fileName;

    public WordRecommender(String fileName) {
        this.fileName = fileName;
    }

    public static void main(String[] args) {

    ArrayList<Word> objectArray = new ArrayList<Word>();

    objectArray.add(new Word("people", null ,0.8));
    objectArray.add(new Word("dogs", null ,0.4));
    objectArray.add(new Word("cats", null ,0.6));

    ArrayList<String> outputArray = new ArrayList<String>();

    for (int i = 0; i < finalArray.size(); i++) {
      // code here to find the value of each double and place the 
      // associated strings into output Array from highest to lowest
    }

    // ideal outputArray order = ["people", "cats", "dogs"]

}
import java.util.ArrayList;

public class Word {

    String wordName;
    ArrayList<Character> uniqueLetters;
    double percent;

    public Word(String string, double percent) {
        ArrayList<Character> tempArray = new ArrayList<Character>();

        for (int i = 0; i < string.length(); i++) { 
            tempArray.add(string.charAt(i));
        }

        this.wordName = string;
        this.uniqueLetters = tempArray;
        this.percent = percent;
    }

}

解决方案


您需要实现的结果可以分为两个主要步骤:

  1. 描述如何,给 2Word秒,其中哪些将放在另一个之前List
  2. 使用比较方法对您的Words列表进行实际排序

第 1 步:我们如何确定哪个单词先出现?

Java 有一个名为Comparable. 这个名字是不言自明的。当你在你的Word类中实现这个接口时,你是在告诉 Java 这个类的实例可以相互比较。

public class Word implements Comparable<Word>{

当您在Word类中编辑此行时,您的 IDE 可能会抱怨“缺少compareTo()方法”。compareTo()方法是在Comparable接口中定义的,它的工作是从 2 个实例中决定哪一个应该被视为“更大”(或者在我们的例子中,应该放在第一个List)。

用法的一个例子是:"apple".compareTo("banana");如果第一个实例(“apple”)“更大”,则此方法调用应返回正数,如果第二个实例(“banana”)“更大”,则返回负数,如果两者具有相同的“值”,则返回零. 顺便说一下,Java 中 scompareTo()实现方法String按字母顺序评估实例。

所以让我们compareTo()为我们的Word实现我们的方法版本

@Override
public int compareTo(Word anotherWord) {
    if(this.percent > anotherWord.percent) {
        return 1;
    } else if (this.percent < anotherWord.percent) {
        return -1;
    } else {
        return 0;
    }
}

请记住,如果第一个实例大于第二个实例,则此实现将返回正值,反之则返回负值。

现在我们有了比较我们的 的方法Words,我们可以继续进行排序部分。

第 2 步:排序算法

互联网上有各种各样的排序算法。有些效率较低,有些则更容易实现。你可以在这里研究其中的一些

对我来说,最简单的排序算法称为BubbleSort不过,它的效率并不高。

ArrayList<Word> objectArray = new ArrayList<Word>();

objectArray.add(new Word("people", 0.8));
objectArray.add(new Word("dogs", 0.4));
objectArray.add(new Word("cats", 0.6));

for(int i = 0; i < objectArray.size() - 1; i++) {
    for(int j = 0; j < objectArray.size() - i - 1; j++) {
        // Remember: a compareTo() call returning a negative number
        // means that the first instance is smaller than the second.
        if(objectArray.get(j).compareTo(objectArray.get(j + 1)) < 0) {
            Word auxiliary = objectArray.get(j);
            objectArray.set(j, objectArray.get(j + 1));
            objectArray.set(j + 1, auxiliary);
        }
    }
}

这两个嵌套for循环将按objectArray的降序排序percent



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/299649/52c113b1b32f91f23f74/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

29 0
收藏该文
已收藏

评论内容:(最多支持255个字符)