Java ArrayList разделить каждый объект - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь разделить каждый объект в ArrayList, потому что многие строки содержат запятую (","). Каждый объект содержит элемент и значение (но не все объекты содержат значение):

   Access control enable                             ,disabled
   Access policy prototyping                         ,enabled
   Access user group                                 
   Implicit roles access policy                      
   World access policy                               ,disabled

Это мой кусок кода:

            List<String> CEP = new ArrayList<String>();
            List<String> CEV = new ArrayList<String>();
            for (String str : CE) {
                for (String s : str.split(",")) {
                    CEP.add(s.trim());
                }
            }
  • "CE" является основным списком ArrayList.
  • "CEP" - это ArrayList, который должен содержать только "элементы" (что до запятой).
  • "CEV" - это ArrayList, который должен содержать все "значения"

Мой кусок кода разделяет его только через запятую для того же ArrayList, и другая проблема состоит в том, как увидеть объект, не имеющий «значения», и добавить пустое значение в значения ArrayList.

Спасибо, ребята.

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Вы можете сделать это, используя java 8 и steam простым способом,

    List<String> CEP = new ArrayList<String>();
    CE.stream().forEach(ce->CEP.addAll(Arrays.asList(ce.split(","))));
    List<String>  CEV= CEP.stream().map(String::trim).filter(s -> s.length()>0).collect(Collectors.toList());

    System.out.println(CEP);
    System.out.println(CEV);
0 голосов
/ 29 августа 2018

Использование массива и проверка его длины позволяет обрабатывать пропущенные значения:

for (String str : CE) {
    String[] a = str.split(",");
    CEP.add(a[0].trim());
    if(a.length > 1) {
        CEV.add(a[1].trim());
    } else {
        CEV.add(null); //just check that this is OK
    }
}

Просто убедитесь, что значение, добавляемое к CEV для пропущенных значений (null в приведенном выше коде), соответствует требуемому.

0 голосов
/ 29 августа 2018

Вы можете разделить и проверить длину массива впоследствии:

public static void main(String[] args) {
    List<String> ce = new ArrayList<String>();

    ce.add("Access control enable                             ,disabled");
    ce.add("Access policy prototyping                         ,enabled");
    ce.add("Access user group                                 ");
    ce.add("Implicit roles access policy                      ");
    ce.add("World access policy                               ,disabled");

    Map<String, String> cepCev = new HashMap<String, String>();

    ce.forEach((String line) -> {
        String[] splitLine = line.split(",");
        if (splitLine.length > 1) {
            cepCev.put(splitLine[0].trim(), splitLine[1].trim());
        } else {
            cepCev.put(splitLine[0].trim(), "not set");
        }
    });

    cepCev.forEach((String key, String value) -> {
        System.out.println(key + ": " + value);
    });
}
0 голосов
/ 29 августа 2018

Может быть, использование парсера CSV, например super-csv , - хороший вариант. Это действительно окупится, когда список через запятую станет более разнообразным.

Univocity предоставляет эталонный анализатор CSV . Это говорит о том, что univocity-парсеры быстро, что неудивительно. Вы можете попробовать.

...