Сохранение строки в hashmap с вхождениями - PullRequest
0 голосов
/ 07 марта 2020

У меня есть метод, который возвращает какую-то строку. Я хочу сохранить отдельные слова в HashMap с их количеством вхождений?

public static void main(String[] args) {
        String s = "{link:hagdjh, matrics:[{name:apple, value:1},{name:jeeva, value:2},{name:abc, value:0}]}";

        String[] strs = s.split("matrics");
        System.out.println("Substrings length:" + strs.length);
        for (int i = 0; i < strs.length; i++) {
            System.out.println(strs[i]);
        }

    }

Например, у меня есть строка- "{link: https://www.google.co.in/, matrics: [ {имя: яблоко, значение: 1}, {имя: график, значение: 2}, {имя: ab c, значение: 0}]} ";

Now my hashmap should look like

apple = 1
graph = 2
abc = 0

Как мне поступить?

Я знаю, как использовать HashMaps. В этом случае моя проблема заключается в том, что я не знаю, как проанализировать заданную строку и сохранить слова с их количеством вхождений.

Ответы [ 4 ]

1 голос
/ 07 марта 2020
String regex = "\\{name:(.*), value:(\\d+)\\}";
            HashMap<String, Integer> link = new HashMap<>();

            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(s);

            while (matcher.find()){
                String found = matcher.group(1);
                String number = matcher.group(2);
                link.put(found, Integer.parseInt(number));
            }
0 голосов
/ 07 марта 2020

Попробуйте:

import static java.lang.System.err;
import static java.lang.System.out;
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toMap;

/**
 *  Counting the words in a String.
 */
public class CountWordsInString
{
        /*-----------*\
    ====** Constants **========================================================
        \*-----------*/
    /**
     *  An empty array of {@code ${type_name}} objects.
     */
    public static final String INPUT = "{link:https://www.google.co.in/, matrics:[{name:apple, value:1},{name:graph, value:2},{name:abc, value:0}]}";

        /*---------*\
    ====** Methods **==========================================================
        \*---------*/
    /**
     *  The program entry point.
     *
     *  @param  args    The command line arguments.
     */
    public static void main( final String... args )
    {
        try
        {
            final var result = stream( INPUT.split( "\\W+" ) )
                .filter( s -> !s.isBlank() )
                .filter( s -> !s.matches( "\\d*" ) )
                .collect( groupingBy( s -> s ) )
                .entrySet()
                .stream()
                .collect( toMap( k -> k.getKey(), v -> Long.valueOf( v.getValue().size() ) ) );
            out.println( result.getClass() );
            for( final var entry : result.entrySet() )
            {
                out.printf( "'%s' occurred %d times%n", entry.getKey(), entry.getValue() );
            }
        }
        catch( final Throwable t )
        {
            //---* Handle any previously unhandled exceptions *----------------
            t.printStackTrace( err );
        }
    }   //  main()
}
//  class CountWordsInString

Признался, не самое очевидное решение, но я тоже хотел с ним повеселиться.

INPUT.split( "\\W+" ) дает вам слова в строка, но также цифры и «пустое» слово в начале.

«пустое» слово дополняется первым оператором filter(), числа go - вторым.

Первый collect( groupingBy() ) дает вам HashMap<String,List<String>>, поэтому мне пришлось преобразовать его в HashMap<String,Long> в следующих шагах (в основном со вторым collect( groupingBy() )).

Может быть, есть более эффективное решение, или более элегантное, или даже более эффективное и более элегантное… но оно работает, как и ожидалось, и я повеселился с ним.

Вывод:

class java.util.HashMap
'apple' occurred 1 times
'matrics' occurred 1 times
'abc' occurred 1 times
'in' occurred 1 times
'www' occurred 1 times
'name' occurred 3 times
'link' occurred 1 times
'google' occurred 1 times
'https' occurred 1 times
'co' occurred 1 times
'value' occurred 3 times
'graph' occurred 1 times
0 голосов
/ 07 марта 2020
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<String, Integer>();
        Pattern pattern = Pattern.compile("matrics:\\[\\{(.*?)\\]\\}");
        Matcher matcher = pattern
                .matcher("{link:hagdjh, matrics:[{name:apple, value:1},{name:jeeva, value:2},{name:abc, value:0}]}");
        String data = "";
        if (matcher.find()) {
            data = matcher.group();
        }
        List<String> records = new ArrayList<String>();
        pattern = Pattern.compile("(?<=\\{).+?(?=\\})");
        matcher = pattern.matcher(data);
        while (matcher.find()) {
            records.add(matcher.group());
        }
        for (String s : records) {
            String[] parts = s.split(", ");
            map.put(parts[0].substring(parts[0].indexOf(":") + 1),
                    Integer.parseInt(parts[1].substring(parts[1].indexOf(":") + 1)));
        }
        map.entrySet().forEach(entry -> {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        });
    }
}

Выход:

apple = 1
jeeva = 2
abc = 0
0 голосов
/ 07 марта 2020

Похоже, что ваши данные в формате JSON.

Если гарантированно будет формат JSON, вы можете проанализировать его, используя библиотеку синтаксического анализа JSON, а затем проанализировать данные матрицы в Удобный способ (код следует).

Если данные не гарантированно представлены в формате JSON, вы можете использовать REGEX, чтобы помочь вам разобрать их, как в ответе Реза Соуми.

import org.json.JSONObject;
import org.json.JSONArray;
import java.util.HashMap;

String s = "{link:hagdjh, matrics:[{name:apple, value:1},{name:jeeva, value:2},{name:abc, value:0}]}";

JSONObject obj = new JSONObject(s);
JSONArray matrics = obj.getJSONArray("matrics");
System.out.println(matrics);

HashMap<String, Integer> matricsHashMap = new HashMap<String, Integer>();
for (int i=0;i < matrics.length();i++){
    JSONObject matric = matrics.getJSONObject(i);
    System.out.println("Adding matric: " + matric + " to hash map");
    String matricName = matric.getString("name");
    Integer matricValue = Integer.valueOf(matric.getInt("value"));
    matricsHashMap.put(matricName, matricValue);
}

System.out.println(matricsHashMap);
...