Вот решение. Взгляните на метод select (), который делает реальную вещь (метод main () неоднократно выполняет функцию select (), чтобы показать, что распределение действительно довольно равномерное).
Идея проста: когда вы читаете первую строчку, у нее есть 100% шанс быть выбранным в качестве результата. Когда вы читаете вторую строчку, у нее есть 50% шанс заменить первую строку в качестве результата. Когда вы читаете 3-ю строчку, у нее есть 33% шанс стать результатом. Четвертая строка имеет 25% и т. Д ....
import java.io.*;
import java.util.*;
public class B {
public static void main(String[] args) throws FileNotFoundException {
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i = 0; i < 1000; ++i)
{
String s = choose(new File("g:/temp/a.txt"));
if(!map.containsKey(s))
map.put(s, 0);
map.put(s, map.get(s) + 1);
}
System.out.println(map);
}
public static String choose(File f) throws FileNotFoundException
{
String result = null;
Random rand = new Random();
int n = 0;
for(Scanner sc = new Scanner(f); sc.hasNext(); )
{
++n;
String line = sc.nextLine();
if(rand.nextInt(n) == 0)
result = line;
}
return result;
}
}
Я задаю этот вопрос из-за вашей просьбы от здесь .
Когда вы дублируете данные, нужно помнить одну вещь. Точно так же, как вы добавляете данные, вы должны поддерживать их. Другими словами, если вы хотите обновить / обнаружить объект, вы должны делать это в каждом месте, где он существует.
Какие шаблоны (если таковые имеются) обычно используются для отслеживания дублированных данных, чтобы их можно было корректно обновлять во избежание противоречивых данных?
blockquote>Чтобы отслеживать все операции что нам нужно сделать, чтобы иметь согласованные данные, мы добавляем все операции в пакет. Вы можете добавить одну или несколько операций обновления для разных ссылок, а также удалить или добавить . Об этом см.:
Как насчет создания реляционной таблицы для каждого уникальное местоположение, в котором могут существовать данные, которое используется для восстановления путей, требующих обновления.
blockquote>По моему мнению, нет необходимости добавлять дополнительную «реляционную таблицу», но если вы чувствуете себя комфортно с ней, продолжайте и используйте ее.
Затем вы используете их для восстановления путей дублированных данных для поста (например,
blockquote>/users/[boardOwnerID]/boards/[boardID]/posts/[postID]
)?Да, вам нужно перейти к каждому
document()
метод, соответствующий идентификатор документа, чтобы заставить операцию обновления работать. К сожалению, нет подстановочных знаков в путях Cloud Firestore к документам. Вы должны идентифицировать документы по их идентификаторам.В качестве альтернативы, вы могли бы вместо этого использовать posts_denormalization_tracker, который представляет собой просто набор уникальных идентификаторов postID, который включает в себя подколлекцию местоположений, на которые был дублирован пост? это также не является необходимым, поскольку требует дополнительных операций чтения. Поскольку в Firestore все касается количества операций чтения и записи, я думаю, вам следует еще раз подумать об этом подходе. Пожалуйста, смотрите Firestore использование и ограничения .
, если только правила безопасности Firestore не являются достаточно мощными, чтобы разрешить операции добавления для подколлекции / posts_denormalization_tracker / [postID] / location, не разрешая чтение или обновление подсборки или родительской коллекции postIDs.
blockquote>Правила безопасности Firestore настолько мощны, чтобы сделать это. Вы также можете разрешить читать, писать или даже применять правила безопасности в отношении каждой необходимой вам операции CRUD.
Я в основном ищу разумный способ отследить сильно денормализованные данные.
blockquote>Самый простой способ, который я могу придумать, - это добавить операцию в структуру данных типа ключ и значение. Давайте предположим, что у нас есть карта, которая выглядит следующим образом:
Map<Object, DocumentRefence> map = new HashMap<>(); map.put(customObject1, reference1); map.put(customObject2, reference2); map.put(customObject3, reference3); //And so on
Итерация по карте и добавление всех этих ключей и значений в пакет, фиксация пакета и все.