কম্পিউটার টিউটোরিয়াল

Android-এ সেকেন্ড মোস্ট রিপিটেড স্ট্রিং বের করার পদ্ধতি

Android-এ সেকেন্ড মোস্ট রিপিটেড (Second Most Repeated) স্ট্রিং খুঁজে বের করা

এই টিউটোরিয়ালে আমরা দেখব কিভাবে একটি স্ট্রিং অ্যারেতে ফ্রিকোয়েন্সি কাউন্ট করে দ্বিতীয় সর্বাধিক বার আবির্ভূত স্ট্রিংটি বের করা যায়।

প্রয়োজনীয় ধাপসমূহ

ধাপ ১: নতুন প্রজেক্ট তৈরি করুন

Android Studio → File → New Project → প্রয়োজনীয় ডিটেইলস পূরণ করুন।

ধাপ ২: লেআউট ফাইল (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="30sp"
        android:gravity="center" />

</LinearLayout>

ধাপ ৩: MainActivity.java (উন্নত ও বাগ-ফিক্সড সংস্করণ)

package com.example.myapplication;

import android.os.Build;
import android.os.Bundle;
import android.widget.TextView;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import java.util.*;

public class MainActivity extends AppCompatActivity {

    @RequiresApi(api = Build.VERSION_CODES.P)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String[] strArray = {"aaa", "aaa", "bbb", "ccc", "bbb"};

        // ১. ফ্রিকোয়েন্সি ম্যাপ তৈরি
        Map<String, Integer> freqMap = new HashMap<>();
        for (String s : strArray) {
            freqMap.put(s, freqMap.getOrDefault(s, 0) + 1);
        }

        // ২. ফ্রিকোয়েন্সি অনুযায়ী ডিসেন্ডিং সর্ট
        List<Map.Entry<String, Integer>> sortedEntries = new ArrayList<>(freqMap.entrySet());
        sortedEntries.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue()));

        // ৩. সেকেন্ড মোস্ট রিপিটেড বের করুন
        String result = "পর্যাপ্ত ডেটা নেই";
        if (sortedEntries.size() >= 2) {
            result = sortedEntries.get(1).getKey(); // ০-বেসড: ১ নম্বর = সেকেন্ড মোস্ট
        }

        TextView textView = findViewById(R.id.text);
        textView.setText("সেকেন্ড মোস্ট রিপিটেড: " + result);
    }
}

মূল কোডের সমস্যা ও সমাধান:

  • মূল কোডে HashSet ব্যবহার করা হয়েছিল যা ফ্রিকোয়েন্সি তথ্য হারিয়ে ফেলে।
  • এখানে HashMap দিয়ে ফ্রিকোয়েন্সি কাউন্ট করা হয়েছে, তারপর এন্ট্রিগুলো ফ্রিকোয়েন্সি অনুযায়ী সর্ট করা হয়েছে।
  • getOrDefault() ব্যবহার করে কোড সংক্ষিপ্ত করা হয়েছে।

ফলাফল

ইনপুট: ["aaa", "aaa", "bbb", "ccc", "bbb"]

ফ্রিকোয়েন্সি: aaa=2, bbb=2, ccc=1

সর্টেড (ফ্রিকোয়েন্সি ডিসেন্ডিং): aaa(2), bbb(2), ccc(1)

সেকেন্ড মোস্ট রিপিটেড: "bbb" (টাই ব্রেক: ইনসারশন অর্ডার বা যেকোনো) — নোট: একই ফ্রিকোয়েন্সির ক্ষেত্রে যেকোনো একটি আসতে পারে।

Android-এ সেকেন্ড মোস্ট রিপিটেড স্ট্রিং বের করার পদ্ধতি

এজ কেস হ্যান্ডলিং

  • সকল স্ট্রিং একই ফ্রিকোয়েন্সি হলে → যেকোনো একটি (সেকেন্ড এলিমেন্ট)।
  • ১টি অনIQUE স্ট্রিং হলে → "পর্যাপ্ত ডেটা নেই"।
  • খালি অ্যারে হলে → "পর্যাপ্ত ডেটা নেই"।

সারসংক্ষেপ

HashMap দিয়ে ফ্রিকোয়েন্সি কাউন্ট → List-এ কনভার্ট → কমপারেটর দিয়ে সর্ট → ১ নম্বর ইন্ডেক্স (সেকেন্ড মোস্ট)। এটি O(n log n) টাইম কমপ্লেক্সিটিতে কাজ করে।

  1. Android-এ ConcurrentLinkedQueue-এ এলিমেন্ট খুঁজে বের করার পদ্ধতি

  2. অ্যান্ড্রয়েডে ঠিকানা থেকে ল্যাটিটিউড এবং লংগিটিউড বের করা

  3. অ্যান্ড্রয়েডে লাইন আঁকা (Canvas এবং Paint ব্যবহার করে)

  4. অ্যান্ড্রয়েডে ছবিকে Base64 স্ট্রিং-এ রূপান্তর করার পদ্ধতি