wake-up-neo.com

Eigenschaftendatei mit einer Liste als Wert für einen einzelnen Schlüssel

Für mein Programm möchte ich einen Schlüssel aus einer Eigenschaftendatei und eine zugehörige Werteliste für den Schlüssel lesen.
In letzter Zeit habe ich es versucht

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();
    }

und meine Eigenschaftendatei ist wie unten - 

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

Ich möchte für Schlüssel A eine Liste, die [Apple, ALPHABET,ANT] und B [BAT,BALL,BUS] enthalten.
.__ Map sollte also so sein {A=[Apple, ALPHABET,ANT], B=[BAT,BALL,BUS]} aber ich bekomme 
{A=[ANT], B=[BUS]}
Ich habe im Internet nach einem solchen Weg gesucht, aber nichts gefunden. Ich wünschte, es sollte einen Weg geben.

22
NIVESH SENGAR

Versuchen Sie, die Eigenschaften als durch Kommas getrennte Liste zu schreiben, Dann teilen Sie den Wert auf, nachdem die Eigenschaftendatei geladen wurde . Zum Beispiel

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

Sie können auch org.Apache.commons.configuration verwenden und den Wertbegrenzer mithilfe der AbstractConfiguration.setListDelimiter (char) - Methode ändern, wenn Sie in Ihren Werten ein Komma verwenden.

36
DwB

Die durch Kommas getrennte Listenoption ist die einfachste, wird jedoch schwierig, wenn die Werte Kommas enthalten können.

Hier ist ein Beispiel für den Ansatz von a.1, a.2, ...:

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;
}
11
subie

Wenn dies für einige Konfigurationsdateien gilt, sollten Sie die Apache-Konfiguration in Betracht ziehen. https://commons.Apache.org/proper/commons-configuration/javadocs/v1.10/apidocs/index.html?org/Apache/commons/configuration/PropertiesConfiguration.html .__ Mehrere Werte in eine Taste - Das Format unterscheidet sich jedoch etwas

key=value1,value2,valu3 gibt drei Werte gegen denselben Schlüssel.

4
Jayan

Ihre Logik ist fehlerhaft ... im Grunde müssen Sie:

  1. holen Sie sich die Liste für den Schlüssel
  2. wenn die Liste null ist, erstellen Sie eine neue Liste und fügen Sie sie in die Karte ein
  3. füge das Wort der Liste hinzu

Du machst nicht Schritt 2.

Hier ist der Code, den Sie wollen:

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());
}

Beachten Sie auch die "richtige" Möglichkeit, die Einträge einer Karte/Eigenschaften zu durchlaufen - über ihre entrySet()

3
Bohemian

Erstellen Sie einen Wrapper für Eigenschaften und nehmen Sie an, dass Ihr A-Wert die Schlüssel A.1, A.2 usw. hat. Wenn Sie nach A gefragt werden, liest Ihr Wrapper alle A- Elemente und erstellt die Liste. HTH

2
davidfrancis

Es gibt wahrscheinlich einen anderen Weg oder besser. Aber so mache ich das in Spring Boot.

Meine Eigenschaftsdatei enthält die folgenden Zeilen. "," ist das Trennzeichen in jeder Zeile.

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;

Meine Serverkonfiguration

@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-Klasse.

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();
    }
}

Dann habe ich in meiner Runner-Klasse 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);
        }
    }
}

Hoffe das hilft

1
Gunnlaugur