2016-08-11 81 views
1

我有一组初始数据,可以用两种不同的格式进行匹配。这些条目可以是完全匹配或提供范围。范围值将是十进制格式的整数 - 但要匹配的数据可以是十六进制和十进制。基地将在初始数据内显示。因此,最初的数据看起来像下面(JSON格式):如何将字符串转换为Java中的不同类?

[ 
    {"value":"X"}, 
    {"value":"Y"}, 
    {"START":"0000", "END":"0010", "INPUTBASE":"10"}, 
    {"START":"0200", "END":"0300", "INPUTBASE":"16"} 
] 

所以我需要一个功能类似boolean contains(final String value)会检查是否值包含在“守护者”中设置的串X,Y ,8,FF将全部命中 - FF作为十六进制数(多个比赛不是问题)。我所做的是创造两个单一的值与一个Range s包裹基地。我的代码是类似如下:

Set<WrappedRange> wrappedRangeSet; 
Set<String> singleEntrySet; 
public boolean contains(final String value) { 
    return singleEntrySet.contains(value) || valueInRange(value); 
} 

private boolean valueInRange(final String incoming) { 
    Long value; 
    for(WrappedRange<Long> wrappedRange : wrappedRangeSet) { 
     try { 
      value = Long.valueOf(incoming, wrappedRange.getBase()); 
     } catch (NumberFormatException nfe) { 
      continue; // not worried if wrong format... 
     } 
     if (wrappedRange.contains(value)) { 
      return true; 
     } 
    } 
    return false; 
} 

的WrappedRange样子:

class WrappedRange<C Extends Comparable> { 
    private final int base; 
    private final Range<C> range; 

    public WrappedRange(final Range<C> range, final int base) { 
     this.range = range; 
     this.base = base; 
    } 

    public boolean contains(final C value) { 
     return range.contains(value); 
    } 

    public int getBase() { 
     return int base; 
    } 
} 

在最低限度,我想摆脱WrappedRange.getBase()方法,并从字符串移动转换为所需的类型进入WrappedRange类。然后可以将contains(String)方法添加到WrappedRange类。在valueInRange方法中的循环被简化为:

for(WrappedRange<Long> wrappedRange : wrappedRangeSet) { 
    if (wrappedRange.contains(value)) { 
     return true; 
    } 
} 

我遇到的问题是,我所做的假设,我比较值是一个长期的,而不是任何扩展可比。我可以修复WrappedRange以使用Longs,但是我不能将该类用于其他可比较对象。

理想情况下,我想限制字符串到WrappedRange类的转换,因为可能有其他扩展的Comparable将来可能用于输入包含函数。该班级看起来如下所示:

class WrappedRange<C Extends Comparable> { 
    private final int base; 
    private final Range<C> range; 

    public WrappedRange(final Range<C> range, final int base) { 
     this.range = range; 
     this.base = base; 
    } 

    public boolean contains(final C value) { 
     return range.contains(value); 
    } 

    public boolean contains(final String incoming) { 
     C value = convert(incoming); 
     return range.contains(value); 
    } 

    private convert(final String incoming) { 
     // ... convert to type C and return. 
    } 
} 

有没有简单的方法来做到这一点?它甚至有可能吗?

+0

你有没有尝试反序列化Json到Java对象,然后验证/比较特定的值? –

+0

以JSON格式化的初始集合,它被反序列化以填充集合,但是如果它们存在于集合中,那么接收到的数据将会是直的字符串。所以我不清楚这可能会有什么帮助。 – robert

回答

0

如果输入始终是一个字符串,并且内部结构将始终是一个范围,为什么不这样做呢?

public abstract class WrappedRange<C extends Comparable> { 
    private final Range<C> range; 

    protected WrappedRange(Range<C> range) { 
    this.range = range; 
    } 

    public boolean contains(String incoming) { 
    try { 
     C value = convert(incoming); 
    } catch (Exception ex) { 
     return false; 
    } 
    return range.contains(value); 
    } 

    protected abstract C convert(String incoming); 
} 

class WrappedLongRange extends WrappedRange<Long> { 
    private final int base; 

    WrappedLongRange(Range<Long> range, int base) { 
    super(range); 
    this.base = base; 
    } 

    @Override 
    protected Long convert(String incoming) { 
    return Long.valueOf(incoming, base); 
    } 
} 
相关问题