paint-brush
دلته د فلټر سره د معلوماتو جوړښتونه په زړه پورې ډول زده کولو څرنګوالی دیلخوا@dhruvam
648 لوستل
648 لوستل

دلته د فلټر سره د معلوماتو جوړښتونه په زړه پورې ډول زده کولو څرنګوالی دی

لخوا Dhruvam23m2025/03/04
Read on Terminal Reader

ډېر اوږد؛ لوستل

دا مقاله په فلټر کې تیوري د عملي پلي کولو سره یوځای کوي. دا د ګوګل د *Applied CS سره د Android څخه الهام اخیستل شوی. یوازې په 3-4 ساعتونو کې، تاسو به د دې بنسټیزو معلوماتو جوړښتونو ژوره پوهه ترلاسه کړئ.
featured image - دلته د فلټر سره د معلوماتو جوړښتونه په زړه پورې ډول زده کولو څرنګوالی دی
Dhruvam HackerNoon profile picture
0-item

لوبې جوړې کړئ او د کمپیوټر ساینس زده کړئ.


د معلوماتو جوړښتونه د سافټویر د اغیزمن پرمختګ بنسټ جوړوي، مګر د زده کړې دودیز میتودونه ډیری وختونه دوی د ریښتینې نړۍ غوښتنلیکونو څخه خلاص او جلا احساسوي. دا مقاله یو مختلف چلند غوره کوي - په فلټر کې د عملي پلي کولو سره تیوري یوځای کول ترڅو زده کړه په زړه پورې او عملي دواړه کړي.


د ګوګل د انډرایډ سره د تطبیق شوي CS څخه الهام اخیستل شوی، د فلټر لپاره دا تطبیق د Arrays، HashSets، او HashMaps د پوهیدو لپاره یو متقابل لاره چمتو کوي. یوازې په 3-4 ساعتونو کې، تاسو به د دې بنسټیزو معلوماتو جوړښتونو ژوره پوهه ترلاسه کړئ پداسې حال کې چې دوی په معنی شرایطو کې پلي کوئ.


که تاسو یو نوښتګر یاست چې غواړئ خپل د CS اساسات پیاوړي کړئ یا یو تجربه لرونکی پراختیا کونکی یاست چې غواړئ خپل مهارتونه ښه کړئ، دا لارښود د اړینو معلوماتو جوړښتونو ماسټر کولو لپاره یوه اغیزمنه او خوندوره لاره وړاندې کوي. راځئ چې پیل وکړو.

د دې مقالې موخې:

  1. ځان پوه کړئ چې څنګه قاموسونه د معلوماتو ذخیره کولو لپاره کارول کیدی شي (په دې حالت کې کلمې).
  2. د کلمو ګروپونو ذخیره کولو لپاره د هش نقشې وکاروئ، کوم چې انګرامونه دي.
  3. د هغو محدودیتونو تشریح کولو توان ولرئ چې ځینې ډیټا جوړښتونه ورسره مخ کیږي کله چې د لویو ډیټا سیټونو سره کار کوي.

چمتووالی:

موږ به د ورکشاپ په فعالیت کې د څو معلوماتو جوړښتونو څخه کار واخلو، نو مهرباني وکړئ لیستونه ، هش سیټونه ، او هش میپس بیاکتنه وکړئ. تاسو باید وکولی شئ په ډارټ کې د دې معلوماتو جوړښتونو په کارولو سره د عناصرو شتون په ډاډ سره داخل کړئ، حذف کړئ، لاسرسی ومومئ او وګورئ.


دا د معلوماتو جوړښتونو، هش سیټس او هش میپ یوه کوچنۍ پیژندنه ده.


د ګرمولو لپاره یو کوچنی پیلیدونکی تمرین:

د مثال په توګه د HashMaps په کارولو سره د فعالیت په توګه، یو پروګرام جوړ کړئ (ضروري نه ده چې د فلټر ایپ وي - د قوماندې کرښه سمه وي) چې د هیواد درې توري کوډ واخلي ( ISO-3166 وګورئ) او د هغه هیواد بشپړ نوم بیرته راولي چې ورسره تړاو لري.


د مثال په ډول:


 Input | Output ----- | ---------------------------------------------------- GBR | United Kingdom of Great Britain and Northern Ireland IDN | Indonesia IND | India


د توسیع په توګه، که چیرې داخل شوی متن له دریو تورو څخه ډیر وي، نو دا د یو هیواد نوم په توګه په پام کې ونیسئ، او د هغې لپاره درې توري کوډ بیرته ورکړئ. که چیرې داخل شوی متن نه یو باوري کوډ وي او نه هم د هیواد نوم وي، نو یو ګټور غلطۍ پیغام ولیکئ.


راځئ چې پیل وکړو.


انګرامونه

اناګرام هغه کلمه ده چې د بلې کلمې د تورو د بیا تنظیمولو سره جوړه شوې ده. د مثال په توګه، سینما د یخ سړي اناګرام دی.

د لوبې میکانیزم په لاندې ډول دی:

  1. دا لوبه کارونکي ته د قاموس څخه یوه کلمه ورکوي.


  2. کاروونکی هڅه کوي چې د امکان تر حده ډیر داسې کلمې رامینځته کړي چې د ورکړل شوي کلمې ټول توري او یو اضافي توری ولري. په یاد ولرئ چې د نورو تورو له بیا تنظیم کولو پرته په پیل یا پای کې د اضافي توري اضافه کول باطل دي. د مثال په توګه، که چیرې لوبه د 'ایسک' کلمه د پیل کونکي په توګه غوره کړي، کاروونکی ممکن 'ګلاب' یا 'صفر' اټکل وکړي مګر 'زخم' نه.


  3. کاروونکی کولی شي تسلیم شي او هغه کلمې وګوري چې دوی یې اټکل نه دی کړی.




موږ تاسو ته یو څه د پیل کوډ درکړی دی چې د 10,000 کلمو قاموس لري او د دې لوبې د UI برخې اداره کوي او تاسو به د انګرام بلاک ټولګي لیکلو مسؤلیت ولرئ چې د کلمو ټول لاسوهنې اداره کوي.


د کوډ سفر

د سټارټر کوډ د دریو اصلي ډارټ ټولګیو څخه جوړ شوی دی:


anagrams_page.dart

دا یو ساده کوډ دی چې هغه سکرین استازیتوب کوي چې موږ یې پورته ګورو. موږ به د سکرین لپاره د حالت مدیریت لپاره یو بلاک وکاروو. موږ به د لوبې تنظیم کولو سره پیل وکړو چې بلاک ته یوه پیښه واستوو او دا به تعریف کړو چې څه به پیښ شي کله چې سکرین د لوبې مختلف حالتونو ته ځواب ووایی.


 import 'package:anagrams/anagrams/bloc/anagram_bloc.dart'; import 'package:anagrams/anagrams/domain/word.dart'; import 'package:anagrams/l10n/l10n.dart'; import 'package:bloc_presentation/bloc_presentation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class AnagramsPage extends StatelessWidget { const AnagramsPage({super.key}); @override Widget build(BuildContext context) { return BlocProvider( create: (_) => AnagramBloc() ..add( SetupAnagrams( DefaultAssetBundle.of(context), ), ), child: const AnagramsView(), ); } } class AnagramsView extends StatelessWidget { const AnagramsView({super.key}); @override Widget build(BuildContext context) { final l10n = context.l10n; return Scaffold( appBar: AppBar(title: Text(l10n.anagramAppBarTitle)), body: BlocBuilder<AnagramBloc, AnagramState>( builder: (context, state) { switch (state.status) { case AnagramGameStatus.gameError: return const Center( child: Text('An error occurred'), ); case AnagramGameStatus.loaded: return Padding( padding: const EdgeInsets.all(20), child: ListView( children: const [ _SelectedWord(), SizedBox(height: 20), _AnagramsTextField(), SizedBox(height: 10), _GuessListView(), ], ), ); case AnagramGameStatus.initial: return const Center( child: CircularProgressIndicator(), ); } }, ), floatingActionButton: const _NextWordButton(), ); } } class _SelectedWord extends StatelessWidget { const _SelectedWord(); @override Widget build(BuildContext context) { return BlocSelector<AnagramBloc, AnagramState, String>( selector: (state) => state.currentWord, builder: (context, currentWord) { return Text.rich( TextSpan( text: 'Find as many words as possible that can be ' 'formed by adding one letter to ', children: [ TextSpan( text: currentWord.toUpperCase(), style: const TextStyle(fontWeight: FontWeight.bold), ), TextSpan( text: ' (but that do not contain the substring' ' ${currentWord.toUpperCase()}).', ), ], ), ); }, ); } } class _AnagramsTextField extends StatelessWidget { const _AnagramsTextField(); @override Widget build(BuildContext context) { final controller = TextEditingController(); return TextField( controller: controller, decoration: const InputDecoration( hintText: 'Enter an anagram', border: OutlineInputBorder(), ), keyboardType: TextInputType.text, textInputAction: TextInputAction.done, onSubmitted: (value) { controller.clear(); context.read<AnagramBloc>().add(ProcessWord(value)); }, ); } } class _GuessListView extends StatelessWidget { const _GuessListView(); @override Widget build(BuildContext context) { return BlocSelector<AnagramBloc, AnagramState, List<Word>>( selector: (state) => state.guesses, builder: (context, guesses) { return Column( children: guesses.map((word) { return ListTile( minTileHeight: 0, contentPadding: EdgeInsets.zero, visualDensity: VisualDensity.compact, title: Text(word.value), leading: Icon( word.isAnagram ? Icons.check : Icons.close, color: word.isAnagram ? Colors.green : Colors.red, ), ); }).toList(), ); }, ); } } class _GameResult extends StatelessWidget { const _GameResult(this.currentWord, this.result); final List<Word> result; final String currentWord; @override Widget build(BuildContext context) { return ListView( shrinkWrap: true, children: [ const SizedBox(height: 20), Padding( padding: const EdgeInsets.symmetric( horizontal: 20, ), child: Text( 'Game Result for $currentWord', style: const TextStyle(fontSize: 20), ), ), Padding( padding: const EdgeInsets.all(20), child: SizedBox( width: double.infinity, child: DataTable( decoration: BoxDecoration( border: Border.all( color: Colors.grey.shade400, ), borderRadius: BorderRadius.circular(10), ), columns: const [ DataColumn(label: Text('Possible Anagrams')), DataColumn(label: Text('Your Guesses')), ], rows: result.map((word) { return DataRow( cells: [ DataCell(Text(word.value)), DataCell( Center( child: Icon( word.isAnagram ? Icons.check : Icons.close, color: word.isAnagram ? Colors.green : Colors.red, ), ), ), ], ); }).toList(), ), ), ), ], ); } } class _NextWordButton extends StatelessWidget { const _NextWordButton(); @override Widget build(BuildContext context) { final l10n = context.l10n; return BlocPresentationListener<AnagramBloc, AnagramPresenterEvent>( listener: (context, event) { if (event is FinishGuess) { // show a bottom sheet with the anagrams that were not guessed showModalBottomSheet<void>( context: context, useSafeArea: true, builder: (context) { return _GameResult(event.currentWord, event.result); }, ); } }, child: FloatingActionButton.extended( onPressed: () async { context.read<AnagramBloc>().add(ResetGame()); }, label: Text(l10n.nextWordButton), ), ); } }


  • _SelectWord : د لوبې لپاره غوره شوی کلمه ښیي چې له هغې څخه انګرامونه جوړیږي.


  • _AnagramsTextField : کلمه اخلي او د هغه کلمې پروسس کولو لپاره یوه پیښه چلوي چې کارونکي یې ټایپ کړی دی.


  • _GuessListView : هغه اټکلونه ښیې چې کارونکي یې داخل کړي دي او ایا دوی سم دي که نه.


  • _NextWordButton : لوبه بیا تنظیموي او کارونکي ته د اوسني کلمې ټول اناګرامونه او هغه یو چې کارونکي یې اټکل کړی دی وړاندې کوي.


anagram_states.dart


 enum AnagramGameStatus { initial, loaded, gameError } const minNumAnagrams = 5; const defaultWordLength = 3; const maxDefaultWordLength = 7; @immutable final class AnagramState extends Equatable { factory AnagramState({ AnagramGameStatus status = AnagramGameStatus.initial, List<String> words = const [], String currentWord = '', List<String> anagrams = const [], List<Word> guesses = const [], HashSet<String>? wordSet, HashMap<String, List<String>>? anagramMap, HashMap<int, List<String>>? sizeToWords, int wordLength = defaultWordLength, }) { return AnagramState._( status: status, words: words, currentWord: currentWord, anagrams: anagrams, guesses: guesses, wordSet: wordSet ?? HashSet<String>(), anagramMap: anagramMap ?? HashMap<String, List<String>>(), sizeToWords: sizeToWords ?? HashMap<int, List<String>>(), wordLength: wordLength, ); } const AnagramState._({ required this.status, required this.words, required this.currentWord, required this.anagrams, required this.guesses, required this.wordSet, required this.anagramMap, required this.sizeToWords, this.wordLength = defaultWordLength, }); // The current status of the game final AnagramGameStatus status; // All the words in the game final List<String> words; // Currently chosen word of the game to form anagrams final String currentWord; // All the anagrams for the current word final List<String> anagrams; // All the guesses user has made final List<Word> guesses; // A set of all the words in the game final HashSet<String> wordSet; // A map of anagrams for each word final HashMap<String, List<String>> anagramMap; // Stores the words in increasing order of their length final HashMap<int, List<String>> sizeToWords; final int wordLength; AnagramState copyWith({ AnagramGameStatus? status, List<String>? words, String? currentWord, List<String>? anagrams, List<Word>? guesses, HashSet<String>? wordSet, HashMap<String, List<String>>? anagramMap, HashMap<int, List<String>>? sizeToWords, int? wordLength, }) { return AnagramState( status: status ?? this.status, words: words ?? this.words, currentWord: currentWord ?? this.currentWord, anagrams: anagrams ?? this.anagrams, guesses: guesses ?? this.guesses, wordSet: wordSet ?? this.wordSet, anagramMap: anagramMap ?? this.anagramMap, sizeToWords: sizeToWords ?? this.sizeToWords, wordLength: wordLength ?? this.wordLength, ); } @override List<Object?> get props => [ status, words, currentWord, anagrams, guesses, wordSet, anagramMap, sizeToWords, wordLength, ]; }


انګرام سټیټ د لوبې چلولو لپاره اړین ټول حالت متغیرات ساتي.

  • status : دا ساتي که لوبه باریږي (لومړنۍ)، بار کیږي، یا کومه تېروتنه اچول کیږي.
  • words : د word.txt فایل څخه ټول هغه کلمې لیست کوي چې له فایل څخه بار شوي دي.
  • anagrams : د غوره شوي کلمې لپاره ټول انګرامونه ساتي.
  • currentword : د کلمو له لیست څخه غوره شوی کلمه او هغه کلمه چې انګرامونه ترې جوړیږي.
  • guesses : ټول هغه انتخابونه چې کارونکي یې داخلوي او ایا هغه سم دي یا غلط.


موږ به په مقاله کې وروسته پاتې جزئیاتو ته ورسیږو.


anagram_bloc.dart


 import 'dart:async'; import 'dart:collection'; import 'dart:convert'; import 'package:anagrams/anagrams/domain/word.dart'; import 'package:bloc_presentation/bloc_presentation.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; part 'anagram_events.dart'; part 'anagram_states.dart'; class AnagramBloc extends Bloc<AnagramEvent, AnagramState> with BlocPresentationMixin<AnagramState, AnagramPresenterEvent> { AnagramBloc() : super(AnagramState()) { on<SetupAnagrams>(_onSetupAnagrams); on<ProcessWord>(_onProcessWord); on<ResetGame>(_onResetGame); } Future<void> _onSetupAnagrams( SetupAnagrams event, Emitter<AnagramState> emit, ) async { try { // this should not be done here, // but for the sake of simplicity, we will do it here final wordsFile = await event.defaultAssetBundle.loadString('assets/words.txt'); // read each line in the file final words = const LineSplitter().convert(wordsFile); // change the state of the game emit( state.copyWith( status: AnagramGameStatus.loaded, words: words, ), ); // reset the game _onRestartGame(emit); } catch (e) { emit( state.copyWith( status: AnagramGameStatus.gameError, ), ); } } Future<void> _onProcessWord( ProcessWord event, Emitter<AnagramState> emit, ) async { try { final word = event.word.trim().toLowerCase(); if (word.isEmpty) { return; } if (_isGoodWord(word) && state.anagrams.contains(word)) { // remove the word from the list of anagrams // add the word to the list of guesses emit( state.copyWith( anagrams: state.anagrams..remove(word), guesses: [...state.guesses, Word(word, isAnagram: true)], ), ); // if there are no more anagrams, the game is over // call _onResetGame to reset the game if (state.anagrams.isEmpty) { add(ResetGame()); } } else { emit( state.copyWith( guesses: [...state.guesses, Word(word)], ), ); } } catch (e) { // show an error message } } FutureOr<void> _onResetGame(ResetGame event, Emitter<AnagramState> emit) { _onGameFinished(); _onRestartGame(emit); } void _onRestartGame(Emitter<AnagramState> emit) { final starterWord = _pickGoodStarterWord(emit); emit( state.copyWith( status: AnagramGameStatus.loaded, currentWord: starterWord, anagrams: _getAnagrams(starterWord), guesses: [], ), ); } void _onGameFinished() { emitPresentation(FinishGuess(_result, state.currentWord)); } List<Word> get _result { // All the anagrams that were not guessed final notGuessedAnagrams = state.anagrams.map(Word.new).toList(); // All the guesses that were made final guesses = state.guesses.where((word) => word.isAnagram).toList(); // return the list of anagrams that were not guessed return [...guesses, ...notGuessedAnagrams]; } /// create a function to find all the anagrams of the target word List<String> _getAnagrams(String targetWord) { // find all the anagrams of the target word final anagrams = <String>[]; // return the list of anagrams return anagrams; } // ignore: unused_element List<String> _getAnagramsWithOneMoreLetter(String targetWord) { final anagrams = HashSet<String>(); // return the list of anagrams return anagrams.toList(); } /// Picks a good starter word for the game. String _pickGoodStarterWord(Emitter<AnagramState> emit) { const word = 'skate'; return word; } /// Checks if the word is a good word. bool _isGoodWord(String word) { return true; } }


  • onSetupAnagrams : فایل لولي، کلمې ویشي، او په لیست کې یې اضافه کوي. دا اوسنی کلمه هم پیدا کوي، د هغه غوره شوي کلمې لپاره انګرامونه پیدا کوي، او حالت تازه کوي.


  • onProcessWord : دا هغه هینډلر دی چې هغه وخت بلل کیږي کله چې کاروونکی اټکل ته ننوځي او حالت تازه کړي.
  • onReset : د بل کلمې تڼۍ کلیک کولو سره غږ کیږي او لوبه بیا تنظیموي.
  • isGoodWord : دا ثابتوي چې ورکړل شوی کلمه په قاموس کې ده او د اصلي کلمې په پیل یا پای کې د توري په اضافه کولو سره نه جوړیږي.
  • getAnagrams : د یوې ورکړل شوې کلمې د ټولو ممکنه انګرامونو لیست جوړوي.
  • getAnagramsWithOneMoreLetter : د ټولو ممکنه کلمو لیست جوړوي چې د ورکړل شوي کلمې ته د یو توري اضافه کولو سره جوړ کیدی شي.
  • pickGoodStarterWord : په ناڅاپي ډول یوه کلمه غوره کړئ چې لږترلږه د انګرامونو مطلوب شمیر ولري.

لومړۍ مرحله: اړین توکي

لومړی پړاو د یو ډیر ساده کاري پروګرام په جوړولو تمرکز کوي. تاسو به هغه بنسټونه پلي کوئ چې په پایله کې به یې په دوهم او دریم پړاو کې جوړ شي.


موږ به په anagram_bloc.dart کار وکړو.

انګرامونه ترلاسه کړئ

getAnagrams تطبیق کړئ کوم چې یو تار اخلي او زموږ په ان پټ کې د هغه تار ټول انګرامونه موندلي دي. زموږ ستراتیژي به اوس ساده وي: یوازې words لیست کې هر تار د ان پټ کلمې سره پرتله کړئ ترڅو معلومه کړئ چې ایا دوی انګرامونه دي. مګر موږ به دا څنګه وکړو؟


مختلفې ستراتیژۍ شتون لري چې تاسو یې کارولی شئ ترڅو معلومه کړئ چې ایا دوه تارونه د یو بل اناګرامونه دي (لکه د هر توري د پیښو شمیرل) مګر زموږ د هدف لپاره تاسو به یو مرستندویه فعالیت رامینځته کړئ (چې ورته sortLetters وایی) چې یو String اخلي او بل String د الفبا په ترتیب سره د ورته تورو سره بیرته راولي (د مثال په توګه "پوسټ" -> "پوسټ").


دا معلومول چې ایا دوه تارونه اناګرامونه دي بیا یوه ساده خبره ده چې وګوري چې دوی ورته اوږدوالی لري (د سرعت لپاره) او وګوري چې د دوی د لیکونو ترتیب شوي نسخې مساوي دي.

د ورډ سیټ او انګرام نقشه

له بده مرغه، دا ساده ستراتیژي به زموږ لپاره ډیره ورو وي چې د دې لوبې پاتې برخه پلي کړو. نو، موږ به اړتیا ولرو چې خپل onSetupAnagrams بیا وګورو او ځینې ډیټا جوړښتونه ومومو چې کلمې په داسې لارو ذخیره کوي چې زموږ د موخو لپاره اسانه وي. موږ به دوه نوي ډیټا جوړښتونه جوړ کړو ( words سربیره):


  • یو HashSet (چې wordSet په نوم یادیږي) چې موږ ته به اجازه راکړي چې په چټکۍ سره (په O(1) کې) تصدیق کړو چې ایا یوه کلمه اعتبار لري.


  • یو HashMap (چې anagramMap په نوم یادیږي) چې موږ ته به اجازه راکړي چې انګرامونه ګروپ کړو. موږ به دا د کیلي په توګه د سټرینګ sortLetters نسخې په کارولو سره او د هغه کلمو لیست ذخیره کولو سره ترسره کړو چې زموږ د ارزښت په توګه د دې کیلي سره مطابقت لري. د مثال په توګه، موږ ممکن د فورمې داخله ولرو: key: "opst" ارزښت: ["post", "spot", "pots", "tops", ...].


لکه څنګه چې تاسو د ان پټ کلمو پروسس کوئ، نو په هر یو کې sortLetters زنګ ووهئ او بیا وګورئ چې ایا anagramMap دمخه د دې کیلي لپاره داخله لري. که داسې وي، نو اوسنی کلمه په هغه کیلي کې List ته اضافه کړئ. که نه نو، یو نوی جوړ کړئ، کلمه ورته اضافه کړئ، او په HashMap کې یې د اړونده کیلي سره ذخیره کړئ.


کله چې تاسو دا کار بشپړ کړ، نو تاسو د لومړي پړاو پای ته رسیدلي یاست! تاسو اوس چمتو یاست چې دوهم پړاو ته لاړ شئ، چیرې چې تاسو به خپل پروګرام ته نور پیچلتیا اضافه کړئ.


د لومړي پړاو لپاره حل

دوهمه موخه: د کیفیت زیاتول

دوهم پړاو د دې ډاډ ترلاسه کولو په اړه دی چې غوره شوي کلمې د انګرام لوبې لپاره مناسبې دي. برعکس. د تیر پړاو په څیر، دا یو په دریو برخو ویشل شوی دی.

isGoodWord

ستاسو راتلونکی دنده د isGoodWord پلي کول دي کوم چې چیک کوي:

  • ورکړل شوی کلمه د قاموس یوه معتبره کلمه ده (د بیلګې په توګه، په wordSet کې)، او
  • دا کلمه د فرعي تار په توګه د اساس کلمه نه لري.




دا چې ایا یوه کلمه د قاموس یوه معتبره کلمه ده، wordSet په لیدلو سره ترسره کیدی شي ترڅو وګوري چې ایا دا کلمه لري. دا چې دا کلمه د فرعي سټرینګ په توګه اساس کلمه نلري، د یوې ننګونې په توګه پریښودل کیږي!

getAnagramsWithOneMoreLetter

په پای کې، getAnagramsWithOneMoreLetter تطبیق کړئ کوم چې یو تار اخلي او ټول هغه انګرامونه پیدا کوي چې د هغه کلمې ته د یو توري اضافه کولو سره جوړ کیدی شي.


ډاډ ترلاسه کړئ چې یو نوی List د خپل بیرته راستنیدونکي ارزښت په توګه معرفي کړئ بیا ورکړل شوی کلمه + د الفبا هر توری یو په یو anagramMap کې د ننوتلو په وړاندې وګورئ.


همدارنګه، onRestartGame تازه کړئ ترڅو getAnagrams پرځای getAnagramsWithOneMoreLetter وکاروئ.


pickGoodStarterWord

که ستاسو لوبه کار کوي، نو د لوبې د لا په زړه پورې کولو لپاره pickGoodStarterWord پلي کولو ته دوام ورکړئ. د کلمې لیست کې یو ناڅاپي پیل ټکی غوره کړئ او په صف کې هر کلمه وګورئ تر هغه چې تاسو یو داسې ومومئ چې لږترلږه minNumAnagrams ولري. ډاډ ترلاسه کړئ چې د صف پیل ته شاوخوا لفافه اداره کړئ که اړتیا وي.



دوه پر دریمه برخه یې بشپړه شوه! یوازې یو پړاو او غځول مخکې له دې چې تاسو بشپړ شئ.


د دوهم پړاو لپاره حل


دریم پړاو: بیا رغونه

په دې وخت کې، لوبه فعاله ده مګر که تاسو د اوږدې اساس کلمې سره پیل وکړئ نو لوبه کول یې خورا ستونزمن کیدی شي. د دې څخه د مخنیوي لپاره، راځئ چې د زیاتیدونکي اوږدوالي کلمې ورکولو لپاره onSetupGame بیا فکتور کړو.


دا ریفیکٹر په onSetupGame کې پیل کیږي چیرې چې word لیست ډکولو سربیره، تاسو باید هره کلمه په HashMap کې هم ذخیره کړئ (راځئ چې ورته sizeToWords ووایو) چې د کلمې اوږدوالی د هغه اوږدوالي د ټولو کلمو List سره نقشه کوي. دا پدې مانا ده چې، د مثال په توګه، تاسو باید وکولی شئ sizeToWords.get(4) په زنګ وهلو سره په قاموس کې ټول څلور توري کلمې ترلاسه کړئ.


په pickGoodStarterWord کې، خپل لټون د length wordLength کلمو پورې محدود کړئ، او کله چې تاسو بشپړ کړئ، wordLength زیات کړئ (پرته لدې چې دا دمخه په axWordLength کې وي) ترڅو راتلونکی غوښتنه یو لوی کلمه بیرته راولي.


د دریم پړاو لپاره حل


پراخونې

دا فعالیت (لکه د ټولو راتلونکو فعالیتونو په څیر) ځینې اختیاري توسیعونه لري. که وخت اجازه ورکړي، لږترلږه د لاندې لیست څخه یو توسیع هڅه وکړئ یا هغه چې تاسو پخپله اختراع کړی وي.


  • دوه توري حالت: کارونکي ته اجازه ورکړئ چې دوه توري اضافه کړي ترڅو انګرامونه جوړ کړي.


  • د کلمو انتخاب غوره کړئ د هغو کلمو په لرې کولو سره چې د ممکنه پیل کونکو کلمو له حوض څخه کافي انګرامونه نلري. په یاد ولرئ چې دا کلمې باید په wordSet کې پاتې شي ځکه چې دوی لاهم په نورو کلمو کې د انګرامونو په توګه کارول کیدی شي.


  • د دوه کلمو حالت: کارونکي ته اجازه ورکړئ چې د کلمو په جوړه کې یو توری اضافه کړي ترڅو دوه نوي معتبر کلمې جوړې کړي.



مبارک شه چې پای ته ورسېدې! تاسو دا څېړلې ده چې څنګه لیستونه، هش سیټونه، او هش میپس په فلټر کې د معلوماتو اغیزمنه اداره کول ځواکمن کوي، لکه څنګه چې دوی په هر ښه اصلاح شوي غوښتنلیک کې کوي. د دې جوړښتونو پوهیدل تاسو ته د اندازې وړ او فعالیت کوډ لیکلو کې یو برتري درکوي. نو مخکې لاړ شئ، او ځان ته په شا باندې یو ښه مستحق ټک ورکړئ! اوس، دا پوهه په عمل کې واچوئ او د حیرانتیا شیانو جوړولو ته دوام ورکړئ!