如何按键和值对地图进行排序,而val是地图/列表本身



我很难理解正确的语法以对映射进行分类,而不是仅仅是一种类型,而可以再次嵌套。我将在这里尝试提出一个合适的例子:

让我们首先做一个随机类:

class NestedFoo{
int valA;
int valB;
String textA;
public NestedFoo(int a, int b, String t){
  this.valA = a;
  this.valB = b;
  this.textA = t;
  }
}

好吧,那是我们的班级。列表来了:

HashMap<Integer, ArrayList<NestedFoo>> sortmePlz = new HashMap<>();

让我们创建3个条目,首先应该显示分类的作品。

ArrayList<NestedFoo> l1 = new ArrayList<>();
n1 = new NestedFoo(3,2,"a");
n2 = new NestedFoo(2,2,"a");
n3 = new NestedFoo(1,4,"c");
l1.add(n1);
l1.add(n2);
l1.add(n3);
ArrayList<NestedFoo> l2 = new ArrayList<>();
n1 = new NestedFoo(3,2,"a");
n2 = new NestedFoo(2,2,"a");
n3 = new NestedFoo(2,2,"b");
n4 = new NestedFoo(1,4,"c");
l2.add(n1);
l2.add(n2);
l2.add(n3);
l2.add(n4);
ArrayList<NestedFoo> l3 = new ArrayList<>();
n1 = new NestedFoo(3,2,"a");
n2 = new NestedFoo(2,3,"b");
n3 = new NestedFoo(2,2,"b");
n4 = new NestedFoo(5,4,"c");
l3.add(n1);
l3.add(n2);
l3.add(n3);
l3.add(n4);

甜,现在将它们放在我们的地图中。

sortmePlz.put(5,l1);
sortmePlz.put(2,l2);
sortmePlz.put(1,l3);

我现在想要的是首先按键对整个地图进行排序,因此该顺序应为L3 L2 L1。然后,我希望每个键内的列表都按以下顺序进行排序:inta,intb,文本(全部上升)

我不知道该怎么做。尤其不是因为Java 8与所有这些Lambdas一起,我试图阅读该主题,但对那里的代码感到不知所措。

预先感谢!我希望该代码没有同义错误,我在GO

上弥补了它。

您可以使用TreeSet而不是常规HashMap,并且您的值将通过key自动排序:

Map<Integer, ArrayList<NestedFoo>> sortmePlz = new TreeMap<>();

第二步我有点困惑。

要按以下顺序进行排序:inta,intb,text(astervending)

我想您想首先比较intA值来对列表进行排序,那么如果它们与intB进行比较,依此类推。如果我正确理解您,您可以将ComparatorcomparingthenComparing一起使用。

sortmePlz.values().forEach(list -> list
            .sort(Comparator.comparing(NestedFoo::getValA)
                            .thenComparing(NestedFoo::getValB)
                            .thenComparing(NestedFoo::getTextA)));

我敢肯定,lambda确实可以做到这一点,但实际上不是必需的。有关lambda的解决方案,请参见 schidu luca 的答案。

如果您想要"旧学校解决方案",请继续阅读。

您不能分类地图。这是没有意义的,因为地图中没有秩序的概念。现在,有一些映射对象以分类方式存储键(例如 treemap )。

您可以订购列表。在您的情况下,将类 nestedfoo compopable(https://docs.oracle.com/javase/8/docs/api/java/java/lang/lang/comparable/comparable.html)。然后,您可以调用方法 collections.sort (https://docs.oracle.com/javase/8/docs/api/java/java/java/util/collections.html#sort-java.util.list.list.list - )在您的列表中。

使用treemap而不是哈希姆普,它解决了第一个问题:按键订购条目。

从地图获得所需的列表后,您可以按vala,valb,text:

对ArrayList进行排序
l1.sort(
                Comparator.comparing(NestedFoo::getValA).thenComparing(NestedFoo::getValB).thenComparing(NestedFoo::getTextA)
        );

并更改您的NestedFoo类定义:

class NestedFoo {
        int valA;
        int valB;
        String textA;
        public NestedFoo(int a, int b, String t) {
            this.valA = a;
            this.valB = b;
            this.textA = t;
        }
        public int getValA() {
            return valA;
        }
        public void setValA(int valA) {
            this.valA = valA;
        }
        public int getValB() {
            return valB;
        }
        public void setValB(int valB) {
            this.valB = valB;
        }
        public String getTextA() {
            return textA;
        }
        public void setTextA(String textA) {
            this.textA = textA;
        }
    }

使用treemap进行排序时,请记住,treemap使用compareTo而不是等于排序并找到重复。当将用作关键的任何对象实现时,CompareTo应与平等和哈希码无关。您可以在此链接上查找一个详细示例https://codingninjaonline.com/2017/09/29/unexpected-results-for-treemap-with-with-inconsistent-compareto-and-equals/

相关内容

  • 没有找到相关文章

最新更新