gpt4 book ai didi

Java 创建自定义 map

转载 作者:行者123 更新时间:2023-12-01 14:19:05 25 4
gpt4 key购买 nike

关于我的以下代码,我有两个问题:

1) 在这种情况下,有什么方法可以实现 Map,而不是只扩展接口(interface)的一个直接实现?不过,我不想编写整个 Map 实现。但很高兴看到我的实现不关心正在使用什么底层 Map 实现。2)有没有不好的做法?

ExtremesMap.java

package ocr.util;

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
*
* @author student
*/
public class ExtremesMap extends HashMap<String, Integer> {
private Set<String> smallest;
private int smallestValue;

private Set<String> biggest;
private int biggestValue;

public ExtremesMap() {
super();
smallest = new HashSet<>();
smallestValue = Integer.MAX_VALUE;
biggest = new HashSet<>();
biggestValue = Integer.MIN_VALUE;
}

@Override
public void put(String key, Integer value) {
if (value == null) {
throw new IllegalArgumentException("ocr.util.ExtremesMap.put: value == null");
}
//TODO for real performance application implement own type of Map directly
Integer retrieveValue = super.get(key);
if (retrieveValue != null) {
throw new IllegalStateException("ocr.util.ExtremesMap.put: Not allowed to modify existing value: key = " + key);
}
else if (retrieveValue == value) {
return;
}
super.put(key, value);
if (value < smallestValue) {
smallest = new HashSet<>();
smallestValue = value;
}
else if (value == smallestValue) {
smallest.add(key);
}
if (value > biggestValue) {
biggest = new HashSet<>();
biggestValue = value;
}
else if (value == biggestValue) {
biggest.add(key);
}
}

public String getSmallestString() {
if (smallest.size() != 1) {
throw new IllegalStateException("ocr.util.ExtremesMap.getSmallest: smallest.size() != 1: smallest.size() = " + smallest.size());
}
return smallest.iterator().next();
}

public Set<String> getSmallestSet() {
return smallest;
}

public List<String> getSmallestList() {
return Arrays.asList(getSmallestArray());
}

public String[] getSmallestArray() {
return smallest.toArray(new String[smallest.size()]);
}

public String getBiggestString() {
if (biggest.size() != 1) {
throw new IllegalStateException("ocr.util.ExtremesMap.getBiggest: biggest.size() != 1: biggest.size() = " + biggest.size());
}
return biggest.iterator().next();
}

public Set<String> getBiggestSet() {
return biggest;
}

public List<String> getBiggestList() {
return Arrays.asList(getBiggestArray());
}

public String[] getBiggestArray() {
return biggest.toArray(new String[biggest.size()]);
}
}

还有一个错误我无法在 put() 中解决:

方法不覆盖或实现父类(super class)型的方法

put(String,Integer) in ExtremesMap cannot implement put(K,V) in Map
return type void is not compatible with Integer
where K,V are type-variables:
K extends Object declared in interface Map
V extends Object declared in interface Map

这里究竟出了什么问题?

问候。

最佳答案

如错误所述,put signature is :

 V put(K key, V value)

这意味着您的方法 put 应该返回 Integer 而不是 void:

public Integer put(String key, Integer value) { ... }

关于你的前两个问题,我想说的是,扩展 HashMap 不是推荐的做法,因为当你覆盖 put 时,你正在改变 Map 的工作方式>。您应该更好地使用组合(一个包含私有(private)字段 Map 供内部使用的普通类)。

要对您的代码进行完整的代码审查,您可以在 Code Review StackExchange 询问.

关于Java 创建自定义 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18439249/

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