Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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_Generics_Collections_Map - Fatal编程技术网

Java 重构:映射<;字符串,双>;映射<;字符串、双精度或字符串>;

Java 重构:映射<;字符串,双>;映射<;字符串、双精度或字符串>;,java,generics,collections,map,Java,Generics,Collections,Map,我有广泛使用的方法,如: public Map<String, Double> parseData(String[] data) { ................. 问题:除了返回地图还有什么想法吗 使用超类: public Map<String, Object> parseData(String[] data) 公共地图解析数据(字符串[]数据) 使用超类: public Map<String, Object> parseData(Strin

我有广泛使用的方法,如:

public Map<String, Double> parseData(String[] data) {
    .................
问题:除了返回
地图
还有什么想法吗

使用超类:

public Map<String, Object> parseData(String[] data)
公共地图解析数据(字符串[]数据)
使用超类:

public Map<String, Object> parseData(String[] data)
公共地图解析数据(字符串[]数据)

据我所知,您需要类似于
Map0的东西,其中Ti,1in是类型表达式。交叉口类型出现
在捕获转换(§5.1.10)和类型推断过程中
(§15.12.2.7). 无法写入交叉点类型
直接作为计划的一部分;没有语法支持这一点。价值观
交叉点类型是指所有交叉点的值的对象
类型Ti,用于1in


因此,您最好解析输入数组并为每个不同的类型保留不同的数组,或者您可以使用包装器类来表示返回的映射中的值,正如其他一些回答者所解释的那样。

据我所知,您需要类似于
Map0的内容,其中Ti,1in是类型表达式。交叉口类型出现
在捕获转换(§5.1.10)和类型推断过程中
(§15.12.2.7). 无法写入交叉点类型
直接作为计划的一部分;没有语法支持这一点。价值观
交叉点类型是指所有交叉点的值的对象
类型Ti,用于1in


因此,您最好解析输入数组,并为每个不同类型保留不同的数组,或者您可以使用包装器类来表示返回的映射中的值,正如其他回答者所解释的那样。

创建一个包装器
StringOrDouble
,它看起来有点像这样:

public class StringOrDouble {
    private String internalString;
    private Double internalDouble;

    public StringOrDouble(String input) {
        internalString = input;
    }

    public StringOrDouble(Double input) {
        internalDouble = input;
    }

    public boolean hasString() {
        return internalString != null;
    }

    public boolean hasDouble() {
        return internalDouble != null;
    }

    public String getString() {
        return internalString;
    }

    public Double getDouble() {
        return internalDouble;
    }
}

然后使用
map
类型的地图。使用这些值时,可以通过使用
hastring()
和/或
hasDouble()
进行测试来检查它是哪一个值。或者,您可以使用一个枚举来确定它是哪种类型。

创建一个包装器
StringOrDouble
,它看起来有点像这样:

public class StringOrDouble {
    private String internalString;
    private Double internalDouble;

    public StringOrDouble(String input) {
        internalString = input;
    }

    public StringOrDouble(Double input) {
        internalDouble = input;
    }

    public boolean hasString() {
        return internalString != null;
    }

    public boolean hasDouble() {
        return internalDouble != null;
    }

    public String getString() {
        return internalString;
    }

    public Double getDouble() {
        return internalDouble;
    }
}
public Map<String, Container> parseData(String[] data)

然后使用
map
类型的地图。使用这些值时,可以通过使用
hastring()
和/或
hasDouble()
进行测试来检查它是哪一个值。或者,您可以使用一个枚举来确定它是哪种类型。

只是@blalasaadri的一个替代方案。不要假装更好:

public Map<String, Container> parseData(String[] data)
 public static class StringDoubleValue {
        private final Optional<String> sValue;
        private final Optional<Double> dValue;

        public MetricValue(String sValue) {
            this.sValue = Optional.of(sValue);
            this.dValue = Optional.absent();
        }

        public MetricValue(Double dValue) {
            this.sValue = Optional.absent();
            this.dValue = Optional.of(dValue);
        }

        public Object get() {
            return (sValue.isPresent()) ? sValue.get() : dValue.get();
        }

        @Override
        public String toString() {
            if (sValue.isPresent()) ? sValue.get() : dValue.get().toString();
        }
    }
公共静态类StringDoubleValue{
私有最终可选值;
私有最终可选数据值;
公共度量值(字符串sValue){
this.sValue=可选的.of(sValue);
this.dValue=可选的.include();
}
公共度量值(双D值){
this.sValue=Optional.缺席();
this.dValue=可选的.of(dValue);
}
公共对象get(){
返回(sValue.isPresent())?sValue.get():dValue.get();
}
@凌驾
公共字符串toString(){
if(sValue.isPresent())?sValue.get():dValue.get().toString();
}
}

只是@blalasaadri的替代品。不要假装更好:

 public static class StringDoubleValue {
        private final Optional<String> sValue;
        private final Optional<Double> dValue;

        public MetricValue(String sValue) {
            this.sValue = Optional.of(sValue);
            this.dValue = Optional.absent();
        }

        public MetricValue(Double dValue) {
            this.sValue = Optional.absent();
            this.dValue = Optional.of(dValue);
        }

        public Object get() {
            return (sValue.isPresent()) ? sValue.get() : dValue.get();
        }

        @Override
        public String toString() {
            if (sValue.isPresent()) ? sValue.get() : dValue.get().toString();
        }
    }
公共静态类StringDoubleValue{
私有最终可选值;
私有最终可选数据值;
公共度量值(字符串sValue){
this.sValue=可选的.of(sValue);
this.dValue=可选的.include();
}
公共度量值(双D值){
this.sValue=Optional.缺席();
this.dValue=可选的.of(dValue);
}
公共对象get(){
返回(sValue.isPresent())?sValue.get():dValue.get();
}
@凌驾
公共字符串toString(){
if(sValue.isPresent())?sValue.get():dValue.get().toString();
}
}


data(字符串数组)如何保存双实例???@Juvanis类似于
newstring[]{“columnName->2.00”,“columnName2->www.google.com”}
另一个想法是创建一个包装器对象来保存字符串/双值“data”(字符串数组)如何保存双实例???@Juvanis类似于
newstring[]{“columnName->2.00”,“columnName2->www.google.com”}
另一个想法是创建一个包装器对象来保存String/Double值,但泛型的想法是严格包含数据类型。我只需要
String
Double
object
并不意味着对输入类型有任何限制,但它保持了代码的简单性。您还可以定义自己的超类泛型是严格包含数据类型的。我只需要
String
Double
Object
并不意味着对输入类型有任何限制,但它使代码保持简单。您还可以定义自己的超类。@StanislavL Guess so。^^@StanislavL Guess so。^^^因为这可能仅用于输出,所以我不会添加setter,而是only getters。否则事情可能会变得混乱。+1,容器是一个更一般的术语。如果
int
或后面出现一些枚举怎么办?在这种情况下,您不必重命名您的类型…@GaborSch它更一般,是的。
StringOrDouble
明确了所包含的内容,这些内容有时可能有用。如果可能进行修改,一个更一般的术语可能是一个好主意。这要看情况而定。@blalasaadri实际上我把它命名为
ValueContainer
——这将最能描述它的用途。因为这可能只是为了输出,我不会添加setter,而只添加getter。否则事情可能会变得混乱。+1,Container是一个更一般的术语。如果
int
或之后会出现一些枚举?在这种情况下,您不必重命名您的类型…@GaborSch它更通用,是的。
StringOrDouble
清楚地说明了所包含的内容,这些内容有时可能有用。如果可能进行修改,则使用更通用的术语可能是一个好主意。这取决于具体情况。@blalasaadri实际上我将其命名为
ValueContainer
-描述其用途的