Start learning free

LESSON 194 OF 414 · NESTED LOOPS

Top K Brands V5 - Filter by Product in Scala

Practice

The full catalog covers many products. Filter to one product first, then rank the top k brands that sell it, using v4's repeated search on the filtered lists.

You start with:

        val products = Array("Laptop", "Phone", "Laptop", "Tablet", "Phone", "Laptop")
        val brands = Array("TechPro", "MegaCorp", "NeoByte", "Quantum", "Zenith", "AlphaTech")
        val ratings = Array(4, 5, 5, 3, 4, 4)
        val target = "Laptop"
        val k = 2

Build:

1. NeoByte (5)
2. TechPro (4)

Rules:

  • Filter: copy the brand and the rating of every row whose product equals target into two new lists, keeping the order.
  • From the filtered lists pick the top k by rating, highest first, with v4's repeated search. Ties go to the entry listed first.
  • If fewer than k products match, list only those that exist: when no brand is left, add no more lines (no extra lines, no error).
  • Each line is "rank. Brand (rating)", starting at rank 1.
  • Print the lines, one per line, with println(...).

Build filteredBrands and filteredRatings first: a loop over the catalog that copies the row when products(i) == target.

Then run v4's repeated search over the filtered lists (same code, new names).

If fewer than k products match, some round finds nobody (bestIndex stays -1): add a line only when a brand was found.

        val products = Array("Laptop", "Phone", "Laptop", "Tablet", "Phone", "Laptop")
        val brands = Array("TechPro", "MegaCorp", "NeoByte", "Quantum", "Zenith", "AlphaTech")
        val ratings = Array(4, 5, 5, 3, 4, 4)
        val target = "Laptop"
        val k = 2

        val filteredBrands = scala.collection.mutable.ArrayBuffer[String]()
        val filteredRatings = scala.collection.mutable.ArrayBuffer[Int]()
        for (i <- 0 until products.size) {
            if (products(i) == target) {
                filteredBrands.append(brands(i))
                filteredRatings.append(ratings(i))
            }
        }
        val used = Array.fill(filteredRatings.size)(false)
        val lines = scala.collection.mutable.ArrayBuffer[String]()
        for (rank <- 1 to k) {
            var bestIndex = -1
            for (i <- 0 until filteredRatings.size) {
                if (!used(i)) {
                    if (bestIndex == -1 || filteredRatings(i) > filteredRatings(bestIndex)) {
                        bestIndex = i
                    }
                }
            }
            if (bestIndex != -1) {
                used(bestIndex) = true
                lines.append(rank.toString() + ". " + filteredBrands(bestIndex) + " (" + filteredRatings(bestIndex) + ")")
            }
        }
        println(lines.mkString("\n"))

STEP 1 OF 18
    Ctrl + Enter to check

    Top K Brands V5 in Scala

    Keep going with ScalaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free