2016-05-03 114 views
0

我有一個Properties的實例,名爲props。該鍵值內容如下:(每個按鍵是唯一的)更新屬性實例的內容

"a" : "apple" 
"c" : "orange" 
"b.1" : "tea" 
"b.2" : "coffee" 
"b.3" : "coke" 
... 

我想實現的是:

  • 我只是在按鍵b.<number>感興趣,我需要b.1具有值water

  • 如果有一個價值water但與關鍵b.1,而是與關鍵b.<x>,那麼,我換的b.1 & b.<x>值。

  • 如果沒有一個值water,我增加1的鍵b.<number>數部,在這之後我插入在Properties實例"b.1" : "water"

我開始使用此代碼來實現它:

// initialize a HashMap 
Map<String, String> propMap = new HashMap<String, String>(); 

// check what are the property key-values 
Set<Object> keySet = props.keySet(); 
for (Object key : keySet) { 
    String keyStr = (String) key; 
    String valueStr = props.getProperty(key); 
    if (keyStr.startsWith("b.")) { 
     // if it is not value "water" 
     if (!valueStr.equals("water")) { 
     // I get lost... 
     } 
    } 
} 

我不知道如何以一種有效的方式,而無需通過屬性多次循環實現這個...

+0

對於你的第三個項目符號,你的意思是你想插入b.1 = water並將所有其他b 值加1? – bphilipnyc

+0

@bphilipnyc,是的,確切地說。 –

+0

好的,那麼我的答案將工作 – bphilipnyc

回答

0

我不要輕易看到一種方法來重複執行此操作(或在下面的情況下,複製到一個新的Properties對象),但下面的代碼將工作。另外,我只在沒有找到水時創建另一個Properties對象,因此根據您的使用情況它可能並不可怕。

private static Properties setUpProperties() { 

    Properties props = new Properties(); 

    props.setProperty("a", "apple"); 
    props.setProperty("c", "orange"); 
    props.setProperty("b.1", "tea"); 
    props.setProperty("b.2", "coffee"); 
    props.setProperty("b.3", "coke"); 
    return props; 
} 

@Test 
public void testProperties() { 
    @SuppressWarnings("unchecked") 
    Map<String, String> sortedMap = new TreeMap(updateContents()); //just for logging 
    System.out.print("Properties=" + sortedMap); 
} 

public static Properties updateContents() { 
    // initialize a HashMap 
    Properties props = setUpProperties(); 
    @SuppressWarnings("unchecked") 
    Map<String, String> sortedMap = new TreeMap(props); //just for logging 
    System.out.print("Properties="+sortedMap+"\n"); 

    // check what are the property key-values 
    boolean foundWater = false; 
    for (String key : props.stringPropertyNames()) { 
     if (key.startsWith("b.")) { //only b keys 
      String value = props.getProperty(key); 
      if ("water".equals(value)) { 
       foundWater = true; 
       if ("b.1".equals(key)) { 
        return props; 
       } 
       else { 
        //swap b.1 value with b.x value 
        int digit = getDigit(key); 
        props.setProperty("b." + digit, props.getProperty("b.1")); 
        props.setProperty("b.1", "water"); 
       } 
      } 
     } 
    } 
    if (foundWater) { 
     return props; 
    } 
    else { 
     Properties propertiesCopy = new Properties(); //avoid a ConcurrentModificationException 
     propertiesCopy.putAll(props); 

     for (String key : propertiesCopy.stringPropertyNames()) { 
      //increment all other b-values by one 
      if (key.startsWith("b.")) { 
       int digit = getDigit(key); 
       int incremented = digit + 1; 
       propertiesCopy.setProperty("b." + incremented, propertiesCopy.getProperty(key)); 
      } 
     } 
     propertiesCopy.setProperty("b.1", "water"); 
     return propertiesCopy; 
    } 
} 

/** 
* Returns the digit given a key from a Properties object (this is x) 
*/ 
private static int getDigit(String key) { 
    String digit = key.substring(key.lastIndexOf(".") + 1); //use period as delimiter 
    return Integer.valueOf(digit); 
} 

您也可以將equalsIgnoreCase代替。

+0

你的函數'setUpProperties()'應該是一個for循環,因爲我不知道屬性的內容,這只是我的例子。所以,總共需要三個for-loops。 –

+0

嗯 - 好的!不會從你原來的帖子中知道。很多時候,你會閱讀和編寫.properties文件,所以實現不是這個答案的一部分。 – bphilipnyc