Java: Поиск в ключах HashMap на основе regex?

Предполагая, что в вашем urls.py

from django.urls import path
from .views import add_vote

urlpatterns = [
    path('post/<int:post_id>/vote/add/', add_vote, name='add-vote'),
]

В вашем views.py

from django.shortcuts import redirect, render

def add_vote(request, post_id):
    if request.method == 'POST':
        # receive your POST data here
        user_id = request.user.id
        post_id = post_id
        if not Votes.objects.filter(user_id=user_id, post_id=post_id).exists():
            Votes.objects.create(**your_data)
        redirect('your-desired-url')
    else:
        # your logic here

14
задан Jacob 26 September 2012 в 02:07
поделиться

5 ответов

Вам необходимо указать нечувствительность к регистру Pattern.compile ("c", Pattern.CASE_INSENSITIVE ) . Чтобы найти слово с c в нем, вам нужно использовать matcher.find () . Matcher.matches () пытается сопоставить всю строку.

10
ответ дан 1 December 2019 в 10:04
поделиться

Но, хм:

(a) Зачем вам использовать HashMap, если вы собираетесь всегда искать его последовательно? Это огромные накладные расходы на обработку хеш-ключей и все такое, когда вы их никогда не используете. Конечно, лучше использовать простой ArrayList или LinkedList.

(b) Какое отношение это имеет к тезаурусу? Зачем вам искать в тезаурусе с помощью регулярных выражений? Если бы я хотел узнать синонимы, скажем, «кошка», я бы подумал, что буду искать «кот», а не «c. *».

Моя первая мысль о том, как построить тезаурус, была бы ... ну, я думаю, первый вопрос, который я задам, это: «Является ли синоним отношением равенства?», т.е. если A является синонимом B, следует ли из этого, что B является синонимом A? И если A - синоним B, а B - синоним C, тогда является ли A синонимом C? Предполагая, что ответы на эти вопросы - «да», то мы хотим создать нечто, что делит все слова на языке на наборы синонимов, чтобы затем мы могли сопоставить любое слово в каждом наборе со всеми другими словами в этом наборе. . Итак, что вам нужно, так это способ взять любое слово, сопоставить его с какой-то точкой связи, а затем перейти от этой точки привязки ко всем словам, которые сопоставлены с ней.

Это было бы просто в базе данных: просто создать таблицу с двумя столбцами, скажем "слово" и "токен", каждый со своим индексом. Все синонимы соответствуют одному и тому же токену. Токен может быть любым, если он уникален для любого заданного набора синонимов, например порядковый номер. Затем найдите данное слово, найдите связанный токен, а затем получите все слова с этим токеном. Например, мы можем создавать записи с (большой, 1), (большой, 1), (гигантский, 1), (кот, 2), (кошачий, 2) и т. Д. Введите слово «большой» и получите 1, затем найдите 1, и вы получите «большой», «большой» или «гигантский».

Я не знаю ни одного класса во встроенных коллекциях Java, который бы это делал. Самый простой способ, который я могу придумать, - это построить две скоординированные хэш-таблицы: одну, которая отображает слова в токены, а другая - отображает токены в массив слов. Итак, таблица 1 может иметь большой-> 1, большой-> 1, гигантский-> 1, кот-> 2, кошачий-> 2 и т. Д. Затем таблица 2 отображает 1 -> [большой, большой, гигантский], 2-> [cat, feline] и т. д. Вы смотрите вверх в первой таблице, чтобы сопоставить слово с токеном, а во второй - для сопоставления этого токена со списком слов. Это неуклюже, потому что все данные хранятся с избыточностью, может быть, есть лучшее решение, но я ' Я не получаю это из головы. (Что ж, было бы легко, если бы мы предположили, что мы собираемся последовательно искать весь список слов каждый раз, но производительность будет отстой, поскольку список станет большим.)

10
ответ дан 1 December 2019 в 10:04
поделиться

Это регулярное выражение, которое вы используете?

Метод Matcher.matches () возвращает истину только в том случае, если вся входная последовательность полностью соответствует выражению (из документации Javadoc), поэтому вы в этом случае потребуется использовать «c. *» , а не «c *» , а также нечувствительность к регистру.

3
ответ дан 1 December 2019 в 10:04
поделиться

Регулярные выражения чувствительны к регистру. Вам нужно:

Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
2
ответ дан 1 December 2019 в 10:04
поделиться

Похоже, вы неправильно используете регулярные выражения. "c" будет соответствовать только строчной букве c, а не прописной.

Тем не менее, я бы посоветовал вам изучить возможность использования встроенной базы данных с возможностями полнотекстового поиска.

2
ответ дан 1 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: