gpt4 book ai didi

Java - 列表排序不起作用

转载 作者:行者123 更新时间:2023-12-02 06:36:27 24 4
gpt4 key购买 nike

我试图通过对 HashMap 的键进行排序来对其进行排序,但它不起作用。排序标准由作为 HashMap 值的列表的长度给出。请参阅下面的代码和一些单元测试。

类(class):

package com.fabri.interpreter.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

import com.fabri.interpreter.VerbExpr;
import com.fabri.interpreter.ObjectExpr;

public class Environment {

private HashMap<VerbExpr, List<ObjectExpr>> map = new HashMap<VerbExpr, List<ObjectExpr>>();

public List<ObjectExpr> eval(VerbExpr verb) {
return map.get(verb);
}

public void put(VerbExpr verb, ObjectExpr words) {
List<ObjectExpr> values;
if(map.get(verb) == null)
values = new ArrayList<ObjectExpr>();
else
values = map.get(verb);
values.add(words);
map.put(verb, values);
}

public HashMap<VerbExpr, List<ObjectExpr>> getMap() {
return map;
}

public void sort() {
List<VerbExpr> keys = new ArrayList<VerbExpr>(map.keySet());
Collections.sort(keys, new Comparator<VerbExpr>() {
@Override
public int compare(VerbExpr verb1, VerbExpr verb2) {
return map.get(verb1).size()-map.get(verb2).size();
}
});
HashMap<VerbExpr, List<ObjectExpr>> sortedMap = new HashMap<VerbExpr, List<ObjectExpr>>();
for(VerbExpr verb : keys) {
sortedMap.put(verb, map.get(verb));
}
map = sortedMap;
}

}

测试类:

package com.fabri.interpreter.util;

import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import com.fabri.interpreter.ObjectExpr;
import com.fabri.interpreter.VerbExpr;
import com.fabri.interpreter.WordExpr;

public class TestEnvironment {

private Object[] verbExprs;

@Before
public void setUp() {
Environment env = new Environment();
List<WordExpr> words1 = new ArrayList<WordExpr>();
words1.add(new WordExpr("american"));
words1.add(new WordExpr("italian"));
env.put(new VerbExpr("was"), new ObjectExpr(words1));
List<WordExpr> words2 = new ArrayList<WordExpr>();
words2.add(new WordExpr("zero"));
words2.add(new WordExpr("one"));
words2.add(new WordExpr("two"));
env.put(new VerbExpr("is"), new ObjectExpr(words2));
env.sort();
verbExprs = env.getMap().keySet().toArray();
}

@Test
public void testEnvironment() {
assertTrue(((VerbExpr)verbExprs[0]).equals("is"));
assertTrue(((VerbExpr)verbExprs[1]).equals("was"));
}

}

最佳答案

普通 HashMap 本质上是无序的。您无法对它们进行排序,也无法假设在迭代它们时检索条目的顺序。选项:

  • 使用 TreeMap如果你想按键排序。
  • 使用 LinkedHashMap如果您想保留插入顺序(这就是您的 sort 方法所假设的)
  • 创建键/值对列表并对其进行排序。

关于Java - 列表排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com