2012-03-16 24 views
18

Đối với chương trình của tôi, tôi muốn đọc khóa từ tệp thuộc tính và Danh sách giá trị được liên kết cho khóa.
Gần đây tôi đã cố gắng như thếTệp thuộc tính có danh sách làm giá trị cho khóa riêng

public static Map<String,List<String>>categoryMap = new Hashtable<String, List<String>>(); 


    Properties prop = new Properties(); 


    try { 

     prop2.load(new FileInputStream(/displayCategerization.properties)); 
     Set<Object> keys = prop.keySet(); 
     List<String> categoryList = new ArrayList<String>(); 
     for (Object key : keys) { 
      categoryList.add((String)prop2.get(key)); 
      LogDisplayService.categoryMap.put((String)key,categoryList); 
     } 
     System.out.println(categoryList); 
     System.out.println("Category Map :"+LogDisplayService.categoryMap); 

     keys = null; 
     prop = null; 

    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 

và tập tính của tôi là như dưới đây -

A=APPLE 
A=ALPHABET 
A=ANT 
B=BAT 
B=BALL 
B=BUS 

Tôi muốn cho khóa A nên có một danh sách có chứa [APPLE, ALPHABET,ANT] và B chứa [BAT,BALL,BUS].
Vì vậy, Bản đồ phải như thế này {A=[APPLE, ALPHABET,ANT], B=[BAT,BALL,BUS]} nhưng tôi nhận được
{A=[ANT], B=[BUS]}
Tôi đã tìm kiếm trên internet theo cách như vậy nhưng không tìm thấy gì. Tôi muốn có một cách. Bất kỳ trợ giúp nào?

+1

tài sản chỉ hỗ trợ 'chìa khóa, giá trị' cặp. khi có nhiều hàng có cùng khóa, cột cuối cùng sẽ thắng (ngay cả hành vi đó có thể 'không xác định'). Đó là đầu vào của bạn được nạp vào categoryMap không giống như bạn nghĩ. Tôi sẽ đề nghị bạn viết một bài kiểm tra 'junit' nhỏ. – Jayan

Trả lời

32

Hãy thử viết thuộc tính dưới dạng danh sách được phân cách bằng dấu phẩy, sau đó chia giá trị sau khi tệp thuộc tính được tải. Ví dụ

a=one,two,three 
b=nine,ten,fourteen 

Bạn cũng có thể sử dụng org.apache.commons.configuration và thay đổi giá trị delimiter sử dụng phương pháp AbstractConfiguration.setListDelimiter(char) nếu bạn đang sử dụng dấu phẩy trong giá trị của bạn.

+0

Câu trả lời hay. Tôi đã suy nghĩ về việc có một tập tin xml, và sau đó viết rất nhiều mã phân tích nó và lưu trữ các đối tượng từ nó. –

+1

Một lớp lót sử dụng cấu hình Apache2: 'new DefaultListDelimiterHandler (','). Split (" a, b, c ", true)' cho: một danh sách các "" a "," b "," c "' . Javadoc: https://commons.apache.org/proper/commons-configuration/apidocs/org/apache/commons/configuration2/convert/DefaultListDelimiterHandler.html – Marcin

1

Tạo trình bao bọc xung quanh các thuộc tính và giả sử giá trị A của bạn có khóa A.1, A.2, v.v. Khi được yêu cầu, trình bao bọc của bạn sẽ đọc tất cả các mục A. * và tạo danh sách. HTH

3

Logic của bạn là thiếu sót ... về cơ bản, bạn cần phải:

  1. có được danh sách cho phím
  2. nếu danh sách là null, tạo ra một danh sách mới và đặt nó trong bản đồ
  3. thêm từ vào danh sách

bạn đang không làm bước 2.

Dưới đây là đoạn code bạn muốn:

Properties prop = new Properties(); 
prop.load(new FileInputStream("/displayCategerization.properties")); 
for (Map.Entry<Object, Object> entry : prop.entrySet()) 
{ 
    List<String> categoryList = categoryMap.get((String) entry.getKey()); 
    if (categoryList == null) 
    { 
     categoryList = new ArrayList<String>(); 
     LogDisplayService.categoryMap.put((String) entry.getKey(), categoryList); 
    } 
    categoryList.add((String) entry.getValue()); 
} 

Cũng lưu ý cách "đúng" để lặp qua các mục nhập của bản đồ/thuộc tính - qua số entrySet().

8

Tùy chọn danh sách được phân tách bằng dấu phẩy là dễ nhất nhưng trở nên khó khăn nếu các giá trị có thể bao gồm dấu phẩy.

Dưới đây là một ví dụ về a.1, a.2, ... Cách tiếp cận:

for (String value : getPropertyList(prop, "a")) 
{ 
    System.out.println(value); 
} 

public static List<String> getPropertyList(Properties properties, String name) 
{ 
    List<String> result = new ArrayList<String>(); 
    for (Map.Entry<Object, Object> entry : properties.entrySet()) 
    { 
     if (((String)entry.getKey()).matches("^" + Pattern.quote(name) + "\\.\\d+$")) 
     { 
      result.add((String) entry.getValue()); 
     } 
    } 
    return result; 
} 
1

Có lẽ một cách khác hay hơn. Nhưng đây là cách tôi làm điều này trong Spring Boot.

Tệp thuộc tính của tôi chứa các dòng sau."," là dấu phân cách trong mỗi dòng.

mml.pots=STDEP:DETY=LI3;,STDEP:DETY=LIMA; 
mml.isdn.grunntengingar=STDEP:DETY=LIBAE;,STDEP:DETY=LIBAMA; 
mml.isdn.stofntengingar=STDEP:DETY=LIPRAE;,STDEP:DETY=LIPRAM;,STDEP:DETY=LIPRAGS;,STDEP:DETY=LIPRVGS; 

máy chủ cấu hình của tôi

@Configuration 
public class ServerConfig { 

    @Inject 
    private Environment env; 

    @Bean 
    public MMLProperties mmlProperties() { 
     MMLProperties properties = new MMLProperties(); 
     properties.setMmmlPots(env.getProperty("mml.pots")); 
     properties.setMmmlPots(env.getProperty("mml.isdn.grunntengingar")); 
     properties.setMmmlPots(env.getProperty("mml.isdn.stofntengingar")); 
     return properties; 
    } 
} 

MMLProperties lớp.

public class MMLProperties { 
    private String mmlPots; 
    private String mmlIsdnGrunntengingar; 
    private String mmlIsdnStofntengingar; 

    public MMLProperties() { 
     super(); 
    } 

    public void setMmmlPots(String mmlPots) { 
     this.mmlPots = mmlPots; 
    } 

    public void setMmlIsdnGrunntengingar(String mmlIsdnGrunntengingar) { 
     this.mmlIsdnGrunntengingar = mmlIsdnGrunntengingar; 
    } 

    public void setMmlIsdnStofntengingar(String mmlIsdnStofntengingar) { 
     this.mmlIsdnStofntengingar = mmlIsdnStofntengingar; 
    } 

    // These three public getXXX functions then take care of spliting the properties into List 
    public List<String> getMmmlCommandForPotsAsList() { 
     return getPropertieAsList(mmlPots); 
    } 

    public List<String> getMmlCommandsForIsdnGrunntengingarAsList() { 
     return getPropertieAsList(mmlIsdnGrunntengingar); 
    } 

    public List<String> getMmlCommandsForIsdnStofntengingarAsList() { 
     return getPropertieAsList(mmlIsdnStofntengingar); 
    } 

    private List<String> getPropertieAsList(String propertie) { 
     return ((propertie != null) || (propertie.length() > 0)) 
     ? Arrays.asList(propertie.split("\\s*,\\s*")) 
     : Collections.emptyList(); 
    } 
} 

Sau đó, trong lớp Runner tôi Autowire MMLProperties

@Component 
public class Runner implements CommandLineRunner { 

    @Autowired 
    MMLProperties mmlProperties; 

    @Override 
    public void run(String... arg0) throws Exception { 
     // Now I can call my getXXX function to retrieve the properties as List 
     for (String command : mmlProperties.getMmmlCommandForPotsAsList()) { 
      System.out.println(command); 
     } 
    } 
} 

Hope this helps

Các vấn đề liên quan