Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于索引值的排序列表_Java_Sorting_Hashset_Linkedhashset - Fatal编程技术网

Java 基于索引值的排序列表

Java 基于索引值的排序列表,java,sorting,hashset,linkedhashset,Java,Sorting,Hashset,Linkedhashset,这就是我到目前为止所做的,我试图根据索引的值对一组列表进行排序 LinkedHashSet<List<String>> sorted = new LinkedHashSet<List<String>>(); 抱歉,如果这让人困惑,我不确定在哪里进行这样的排序。首先,从以下内容中提取: 该链表定义了迭代顺序,即元素插入集合的顺序 因此,您不能仅将数据插入LinkedHashSet就对其进行排序。 您可能会混淆该集合的实现。SortedSet允许您传

这就是我到目前为止所做的,我试图根据索引的值对一组列表进行排序

LinkedHashSet<List<String>> sorted = new LinkedHashSet<List<String>>();
抱歉,如果这让人困惑,我不确定在哪里进行这样的排序。

首先,从以下内容中提取:

该链表定义了迭代顺序,即元素插入集合的顺序

因此,您不能仅将数据插入LinkedHashSet就对其进行排序。 您可能会混淆该集合的实现。SortedSet允许您传递比较器,该比较器将确定数据结构中的元素顺序

另一方面,我不知道您是否随意选择了列表,但在我看来,将3个字符串聚合为一个类属性似乎是更明智的选择。关键是,如果您的元素总是3个元素,最后一个元素是一个双倍值:为什么您需要一个动态结构作为列表

编辑

在这里,您可以更好地实现您想要的:

public class Element
{
    public Element(String a, String b, double val) {
        this.a = a;
        this.b = b;
        this.val = val;
    }

    @Override
    public String toString() {
        return a + "\t" + b + "\t" + val;
    }

    public String a;
    public String b;
    public double val;
}
您可以使用这个类来存储元素。使用示例:

 SortedSet<Element> sorted = new TreeSet<>(new Comparator<Element>() {
        @Override
        public int compare(Element o1, Element o2) {
            return (new Double(o1.val)).compareTo(o2.val);
        }
    });

sorted.add(new Element("testval", "testval", 100.0));
sorted.add(new Element("anotherval", "anotherval", 50.0));
for(Element el: sorted)
{
    System.out.println(el);
}
请注意,比较器是作为实现Java比较器接口的匿名内部类的实例提供的。

首先,从以下内容中提取:

该链表定义了迭代顺序,即元素插入集合的顺序

因此,您不能仅将数据插入LinkedHashSet就对其进行排序。 您可能会混淆该集合的实现。SortedSet允许您传递比较器,该比较器将确定数据结构中的元素顺序

另一方面,我不知道您是否随意选择了列表,但在我看来,将3个字符串聚合为一个类属性似乎是更明智的选择。关键是,如果您的元素总是3个元素,最后一个元素是一个双倍值:为什么您需要一个动态结构作为列表

编辑

在这里,您可以更好地实现您想要的:

public class Element
{
    public Element(String a, String b, double val) {
        this.a = a;
        this.b = b;
        this.val = val;
    }

    @Override
    public String toString() {
        return a + "\t" + b + "\t" + val;
    }

    public String a;
    public String b;
    public double val;
}
您可以使用这个类来存储元素。使用示例:

 SortedSet<Element> sorted = new TreeSet<>(new Comparator<Element>() {
        @Override
        public int compare(Element o1, Element o2) {
            return (new Double(o1.val)).compareTo(o2.val);
        }
    });

sorted.add(new Element("testval", "testval", 100.0));
sorted.add(new Element("anotherval", "anotherval", 50.0));
for(Element el: sorted)
{
    System.out.println(el);
}
注意,比较器是作为实现Java比较器接口的匿名内部类的实例给出的

首先,你不应该使用LinkedHashSet,而应该使用TreeSet。LinkedHashSet将保留插入顺序而不进行排序。 其次,您需要使用一个比较器初始化树集,该比较器根据列表中需要的值进行比较,也就是说,如果您事先知道将表示双精度值的字符串的索引。否则,我建议使用自定义对象而不是列表。 如果决定使用自定义对象,则不必使用比较器作为第二个参数初始化树集

相反,您可以让自定义对象实现Comparable,并在那里实现一次性比较逻辑

这完全取决于您是否只需要按特定顺序排序

最后,自定义对象将要求您重写equals和hashCode

首先,你不应该使用LinkedHashSet,而应该使用TreeSet。LinkedHashSet将保留插入顺序而不进行排序。 其次,您需要使用一个比较器初始化树集,该比较器根据列表中需要的值进行比较,也就是说,如果您事先知道将表示双精度值的字符串的索引。否则,我建议使用自定义对象而不是列表。 如果决定使用自定义对象,则不必使用比较器作为第二个参数初始化树集

相反,您可以让自定义对象实现Comparable,并在那里实现一次性比较逻辑

这完全取决于您是否只需要按特定顺序排序


最后,自定义对象将要求您重写equals和hashCode。

创建一个新类来表示复杂对象。如果可以在对象中存储多个值,则无需在列表中存储多个值

public class ComplexObject {
    private String description1;
    private String description2;
    private Double value;

    public ComplexObject(String description1, String description2, Double value) {
        this.description1 = description1;
        this.description2 = description2;
        this.value = value;
    }

    public void setDescription1(String description1) {
        this.description1 = description1;
    }

    public String getDescription1() {
        return description1;
    }

    public void setDescription2(String description2) {
        this.description2 = description2;
    }

    public String getDescription2() {
        return description2;
    }

    public void setValue(Double value) {
        this.value = value;
    }

    public Double getValue() {
        return value;
    }
}
然后将元素添加到列表中,并使用新的自定义比较器对其进行排序:

public static void main(String[] args) {

    List<ComplexObject> complexObjectList = new ArrayList<ComplexObject>();

    //add elements to the list
    complexObjectList.add(new ComplexObject("testval","testval",100.00d));
    complexObjectList.add(new ComplexObject("anotherval","anotherval",50.00d));

    //sort the list in descending order based on the value attribute of complexObject
    Collections.sort(complexObjectList, new Comparator<ComplexObject>() {
            public int compare(ComplexObject obj1, ComplexObject obj2) {
                return obj2.getValue().compareTo(obj1.getValue()); //compares 2 Double values, -1 if less , 0 if equal, 1 if greater
            }
        });

    //print objects from sorted list
    for(ComplexObject co : complexObjectList){
        System.out.println(co.getDescription1()+" "+co.getDescription2()+" "+co.getValue());
    }
}
输出:

testval testval 100.0 anotherval anotherval 50.0
创建一个新类来表示复杂对象。如果可以在对象中存储多个值,则无需在列表中存储多个值

public class ComplexObject {
    private String description1;
    private String description2;
    private Double value;

    public ComplexObject(String description1, String description2, Double value) {
        this.description1 = description1;
        this.description2 = description2;
        this.value = value;
    }

    public void setDescription1(String description1) {
        this.description1 = description1;
    }

    public String getDescription1() {
        return description1;
    }

    public void setDescription2(String description2) {
        this.description2 = description2;
    }

    public String getDescription2() {
        return description2;
    }

    public void setValue(Double value) {
        this.value = value;
    }

    public Double getValue() {
        return value;
    }
}
然后将元素添加到列表中,并使用新的自定义比较器对其进行排序:

public static void main(String[] args) {

    List<ComplexObject> complexObjectList = new ArrayList<ComplexObject>();

    //add elements to the list
    complexObjectList.add(new ComplexObject("testval","testval",100.00d));
    complexObjectList.add(new ComplexObject("anotherval","anotherval",50.00d));

    //sort the list in descending order based on the value attribute of complexObject
    Collections.sort(complexObjectList, new Comparator<ComplexObject>() {
            public int compare(ComplexObject obj1, ComplexObject obj2) {
                return obj2.getValue().compareTo(obj1.getValue()); //compares 2 Double values, -1 if less , 0 if equal, 1 if greater
            }
        });

    //print objects from sorted list
    for(ComplexObject co : complexObjectList){
        System.out.println(co.getDescription1()+" "+co.getDescription2()+" "+co.getValue());
    }
}
输出:

testval testval 100.0 anotherval anotherval 50.0
可能重复:值始终是列表中的第三个元素吗?是的值始终是相同的索引可能重复:值始终是列表中的第三个元素吗?是的值始终是相同的索引我认为我应该使用对象。@请注意,这不是对象。自定义对象。类似于MyTransferObject的东西,带有相关字段的getter/setter。在我看来,我应该使用对象。@ThatGuy343不是对象,请注意。自定义对象。类似于MyTransferObject的东西,带有相关字段的getter/setter。您能提供一个例子,说明在这种情况下传递一个比较器吗?正如上面所评论的,我不喜欢

那些公共领域。您可能会遇到其他一些代码出现/引用字段并在排序后更改值的风险。我认为最好有私有字段和getter使其不可变。@RoyvanRijn我是不可变的支持者,我在这个例子中的观点是保持简单。OP最初的代码是使用列表来存储结构…@ThatGuy343哈哈,别担心,标记一个对你帮助更大的,这是网站的目标;你能提供一个在这个场景中传递比较器的例子吗?如上所述,我不喜欢使用这些公共字段。您可能会遇到其他一些代码出现/引用字段并在排序后更改值的风险。我认为最好有私有字段和getter使其不可变。@RoyvanRijn我是不可变的支持者,我在这个例子中的观点是保持简单。OP最初的代码是使用列表来存储结构…@ThatGuy343哈哈,别担心,标记一个对你帮助更大的,这是网站的目标;然而,只有当我颠倒顺序时,这才起作用。Collections.reversecomplexObjectList;这就是想法,只是代码上的一个注释:如果使用getter和setter只是为了获取引用并将值传递给set,那么您不认为公开属性并避免样板代码会更简单吗?@pablofranciscope rezHidalgo我认为ComplexObject应该是不可变的,请删除setter。否则,排序后可能会更改对象。我更希望看到一个具有私有字段和getter的构造函数。我不认为getter/setter是样板,它们很容易由IDE生成,并向混合中添加有用的内容。@RoyvanRijn这只是一个通用示例,当然我们这里不需要setter。它们是由IDE自动生成的。我从不使用公共属性,请叫我anal。@RoyvanRijn你是对的,这样更安全。我想说的是,使用getter/setter进行直接访问似乎毫无用处,但只有在我颠倒顺序后,这种方法才能起作用。Collections.reversecomplexObjectList;这就是想法,只是代码上的一个注释:如果使用getter和setter只是为了获取引用并将值传递给set,那么您不认为公开属性并避免样板代码会更简单吗?@pablofranciscope rezHidalgo我认为ComplexObject应该是不可变的,请删除setter。否则,排序后可能会更改对象。我更希望看到一个具有私有字段和getter的构造函数。我不认为getter/setter是样板,它们很容易由IDE生成,并向混合中添加有用的内容。@RoyvanRijn这只是一个通用示例,当然我们这里不需要setter。它们是由IDE自动生成的。我从不使用公共属性,请叫我anal。@RoyvanRijn你是对的,这样更安全。我想说的是,使用getter/setter直接访问似乎毫无用处。