我的任务
在我的JavaScript代码中,我经常使用对象将键"映射"到值,以便稍后可以通过某个值直接访问它们.例如:
var helloMap = {};
helloMap.de = "Hallo";
helloMap["en"] = "Hello";
helloMap.es = "Hola";
Run Code Online (Sandbox Code Playgroud)
所以我使用两种可用的符号对象样式和数组样式在源代码中逐步构建地图对象.
之后我可以访问我添加的值helloMap["de"],例如.如果我不必关心在对象上设置属性的顺序,那就没关系了.
如果我想现在迭代对象属性,据我所知,没有办法确保我将按照它们被添加的顺序迭代它们.
注意:我不能使用一些包装器对象,只需在其中保存一个数组,然后使用其方法添加值,如下所示:
var HelloMap = function(){
this.myMap = [];
this.addProperty = function(key, value){
this.myMap.push({key: key, value: value});
}
}
Run Code Online (Sandbox Code Playgroud)
或类似的东西对我不起作用.因此,解决方案需要对使用该对象的程序员绝对透明.
也就是说我需要的对象是一个空对象,它维护了添加到它的属性的顺序.这样的事情会做:
var helloMap = {};
helloMap = getOrderAwareObject(helloMap);
Run Code Online (Sandbox Code Playgroud)
使得每个以下形式的进一步分配helloMap.xy = "foo"和helloMap["yz"] = "bar"将在对象被跟踪"按顺序",
可能的解决方案
由于我没有在下划线或jQuery中找到任何解决方案给我这样一个特殊的对象,我遇到了为JavaScript对象中的属性定义getter和setter的可能性,Object.defineProperty因为我可以依赖ECMAScript 5标准,我可以使用它.
这个问题是,在实际设置之前,您必须知道可以在对象上设置的所有可能属性.因为如果你定义它,你必须命名它.
我正在搜索的内容类似于Default Getter和Default Setter,如果没有为该属性定义getter和setter,它将应用于该对象.所以我可以隐藏对象界面后面的 …
我想知道有什么更好的方法可以在大型SortedMap中找到大于输入值的第一个值,而不是在下面的示例中循环遍历所有值.或者,如果SortedMap是用于此的最佳结构.
这可以通过谷歌收藏来实现吗?提前致谢
public class mapTest {
public static void main(String[] args) {
SortedMap<Double, Object> sortedMap = new TreeMap<Double, Object>();
sortedMap.put(30d, "lala");
sortedMap.put(10d, "foo");
sortedMap.put(25d, "bar");
System.out.println("result: " + findFirstValueGreaterThan(sortedMap, 28d));
}
public static Object findFirstValueGreaterThan(SortedMap<Double, Object> sortedMap, Double value) {
for (Entry<Double, Object> entry : sortedMap.entrySet()) {
if (entry.getKey() > value) {
// return first value with a key greater than the inputted value
return entry.getValue();
}
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud) 是否有任何具有排序Map(例如TreeMap)但能够替换的Java库keys?例如,我正在寻找可以取代的东西treeMapInstance.firstKey().速度是非常重要的,这就是为什么我不是存储值,删除,然后将值放回新密钥的原因.
在我的应用程序中,我可能有一个对象,如
TreeMap<Long, Double> foo = new TreeMap<Long, Double>();
Run Code Online (Sandbox Code Playgroud)
有时我想在foo不改变相关值的情况下更改密钥.
foo.put(1l, 1.0);
foo.put(2l, 2.0);
Run Code Online (Sandbox Code Playgroud)
在上面的,例如我怎么可能改变key 1l,以5l有效?
我有一个ConcurrentSkipListMap。我需要删除低于的元素key。
这是我可以执行的方法:
private ConcurrentNavigableMap<Double, MyObject> myObjectsMap = new ConcurrentSkipListMap<>();
//...
myObjectsMap = myObjectsMap.tailMap(10.25, false);
Run Code Online (Sandbox Code Playgroud)
看起来还不错,但是我对这些事实感到困惑:
1。
返回的地图受此地图支持,因此返回的地图中的更改会反映在此地图中,反之亦然。
这是否意味着垃圾回收器不会删除旧值?
即,我们删除了旧地图,现在有了新地图。但是此新地图得到了旧地图的支持。那么,旧地图会怎样?是将其删除还是将其永久保存在内存中?
2。
尝试插入超出其范围的键时,返回的映射将抛出IllegalArgumentException。
因此,现在我不能放置小于10.25且大于最后一个最大值的新键了吗?
我很困惑。然后如何正确地需要从ConcurrentSkipListMap中删除元素?
java concurrency java.util.concurrent sortedmap concurrentskiplistmap
可以使用迭代器迭代SortedMap myMap.entrySet().iterator().但是这个迭代器是否保留了有序映射对象的顺序?
SortedMap接口没有自己的方法来遍历条目.什么是迭代的标准方式有序通过条目?
Java 5 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html
Java 6 https://docs.oracle.com/javase/6/docs/api/java/util/SortedMap.html
正如您所看到的,自Java 6以来,这三个api被覆盖了.谁能告诉我做出这样改变的目的是什么?
我有:
var schedulesByMonth = HashMap<String, MutableList<Schedule>>()
Run Code Online (Sandbox Code Playgroud)
Schedule 有一个startDate: Date属性。
我从一个巨大的Schedule对象列表开始,并按月将它们分类到哈希图中。因此,如果 Schedule 对象上的 startDate 是 2018 年 6 月,它将进入 key 的列表June 2018。
这一切都很好,但我需要按月正确排序的选择器的键:
schedulesByMonth.keys
Run Code Online (Sandbox Code Playgroud)
如果那个数组是["July 2018", "August 2018", "June 2018"]我需要的["June 2018", "July 2018", "August 2018"]。
我知道我可以制作一个 sortedMap:
val sorted = schedulesByMonth.toSortedMap(compareBy<String> {
}
Run Code Online (Sandbox Code Playgroud)
但这仅对键 ( String) 进行排序。我怎样才能it成为值 ( MutableList<Schedule>) 以便我可以按startDate其中一个时间表排序?
我想做这样的事情
SortedMap<Integer, String> stuff = new TreeMap<Integer, String>({1:"a",2:"b"});
Run Code Online (Sandbox Code Playgroud)
很像您在 python 中所做的那样,但在 Java 中是可能的,还是调用 .put() 两次的唯一方法?
我正在尝试直接从来自两个不同源的SortedMap两个流生成一个使用流。ArrayList我的目标是存储第二个列表中的SortedMap属性Double作为键,将第一个列表中的对象作为值(如果这些对象具有匹配的属性),该属性由辅助对象检查。
到目前为止,我可以使用以下方法完成它:
SortedMap<Double, FirstObject> myMap = new TreeMap<>(Double::compareTo);
List<FirstObject> myList = firstDao.get(someId).stream()
.filter(firstobject -> secondDao.get(firstObject.getObjectId())
.stream()
.anyMatch(secondObject -> {
if (Helper.check(secondObject).matches()) {
myMap.put(
secondObject.getEfficiency(), firstObject
);
}
return Helper.check(secondObject).matches();
}))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我用该代码生成的代码没有用处myList,但到目前为止,这是我能够填充Map.
有没有一种方法可以直接填充到SortedMap而不需要生成该列表?
public class MapKeyExample {
public static void main(String[] args){
//Initializing a Map of type HashMap
Map<Integer, String> map = new HashMap<>();
Set<Integer> s = new HashSet<>();
map.put(1, "One");
map.put(3, "Three");
map.put(5, "Five");
map.put(7, "Seven");
map.put(9, "Nine");
System.out.println(map);
s = map.keySet();
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
现在的输出是
{1=One, 3=Three, 5=Five, 7=Seven, 9=Nine}
[1, 3, 5, 7, 9]
Run Code Online (Sandbox Code Playgroud)
的预期输出为:
[1, 5, 3, 9, 7]
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何将其修改为Linkedhashmap或treemap吗?非常感谢。
sortedmap ×10
java ×8
map ×3
keyset ×2
treemap ×2
android ×1
arraylist ×1
concurrency ×1
dictionary ×1
entryset ×1
guava ×1
hashmap ×1
java-8 ×1
java-stream ×1
javascript ×1
jquery ×1
kotlin ×1
replace ×1