2016-08-11 29 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); 
    } 
} 
相關問題