From 6adb538fe4f35cf143e83881e69a089fc00f7c0f Mon Sep 17 00:00:00 2001 From: Abhishek Kathuria Date: Fri, 20 Aug 2021 00:53:54 -0700 Subject: [PATCH 1/2] Add support for sorting problems by acceptance rate --- package.json | 23 ++++++++++++++++++ src/commands/plugin.ts | 37 ++++++++++++++++++++++++++++- src/explorer/LeetCodeNode.ts | 4 ++++ src/explorer/explorerNodeManager.ts | 20 ++++++++++++---- src/extension.ts | 1 + src/shared.ts | 8 +++++++ 6 files changed, 88 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7ecd780a..fcfb64a9 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "onCommand:leetcode.testSolution", "onCommand:leetcode.submitSolution", "onCommand:leetcode.switchDefaultLanguage", + "onCommand:leetcode.problems.sort", "onView:leetCodeExplorer" ], "main": "./out/src/extension", @@ -134,6 +135,12 @@ "command": "leetcode.switchDefaultLanguage", "title": "Switch Default Language", "category": "LeetCode" + }, + { + "command": "leetcode.problems.sort", + "title": "Sort Problems", + "category": "LeetCode", + "icon": "$(sort-precedence)" } ], "viewsContainers": { @@ -179,6 +186,11 @@ "command": "leetcode.pickOne", "when": "view == leetCodeExplorer", "group": "overflow@0" + }, + { + "command": "leetcode.problems.sort", + "when": "view == leetCodeExplorer", + "group": "overflow@1" } ], "view/item/context": [ @@ -677,6 +689,17 @@ "default": true, "scope": "application", "description": "Add difficulty badge and colorize problems files in explorer tree." + }, + "leetcode.problems.sort-strategy": { + "type": "string", + "default": "None", + "scope": "application", + "enum": [ + "None", + "Acceptance Rate (Ascending)", + "Acceptance Rate (Descending)" + ], + "description": "Sorting strategy for problems list." } } } diff --git a/src/commands/plugin.ts b/src/commands/plugin.ts index 481bd6dd..a461ba6b 100644 --- a/src/commands/plugin.ts +++ b/src/commands/plugin.ts @@ -2,9 +2,10 @@ // Licensed under the MIT license. import * as vscode from "vscode"; +import { leetCodeTreeDataProvider } from "../explorer/LeetCodeTreeDataProvider"; import { leetCodeExecutor } from "../leetCodeExecutor"; import { IQuickItemEx } from "../shared"; -import { Endpoint } from "../shared"; +import { Endpoint, SortingStrategy } from "../shared"; import { DialogType, promptForOpenOutputChannel, promptForSignIn } from "../utils/uiUtils"; import { deleteCache } from "./cache"; @@ -52,3 +53,37 @@ export function getLeetCodeEndpoint(): string { const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); return leetCodeConfig.get("endpoint", Endpoint.LeetCode); } + +const SORT_ORDER: SortingStrategy[] = [ + SortingStrategy.None, + SortingStrategy.AcceptanceRateAsc, + SortingStrategy.AcceptanceRateDesc, +]; + +export async function switchSortingStrategy(): Promise { + const currentStrategy: SortingStrategy = getSortingStrategy(); + const picks: Array> = []; + picks.push( + ...SORT_ORDER.map((s: SortingStrategy) => { + return { + label: `${currentStrategy === s ? "$(check)" : " "} ${s}`, + value: s, + }; + }), + ); + + const choice: IQuickItemEx | undefined = await vscode.window.showQuickPick(picks); + if (!choice || choice.value === currentStrategy) { + return; + } + + const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); + await leetCodeConfig.update("problems.sort-strategy", choice.value, true); + await leetCodeTreeDataProvider.refresh(); + vscode.window.showInformationMessage(`Switched the sorting strategy to ${choice.value}`); +} + +export function getSortingStrategy(): SortingStrategy { + const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); + return leetCodeConfig.get("problems.sort-strategy", SortingStrategy.None); +} diff --git a/src/explorer/LeetCodeNode.ts b/src/explorer/LeetCodeNode.ts index c8540887..3d2cc74f 100644 --- a/src/explorer/LeetCodeNode.ts +++ b/src/explorer/LeetCodeNode.ts @@ -55,6 +55,10 @@ export class LeetCodeNode { }; } + public get acceptanceRate(): number { + return Number(this.passRate.slice(0, -1).trim()); + } + public get uri(): Uri { return Uri.from({ scheme: "leetcode", diff --git a/src/explorer/explorerNodeManager.ts b/src/explorer/explorerNodeManager.ts index 95053263..a04ad55c 100644 --- a/src/explorer/explorerNodeManager.ts +++ b/src/explorer/explorerNodeManager.ts @@ -4,7 +4,8 @@ import * as _ from "lodash"; import { Disposable } from "vscode"; import * as list from "../commands/list"; -import { Category, defaultProblem, ProblemState } from "../shared"; +import { getSortingStrategy } from "../commands/plugin"; +import { Category, defaultProblem, ProblemState, SortingStrategy } from "../shared"; import { shouldHideSolvedProblem } from "../utils/settingUtils"; import { LeetCodeNode } from "./LeetCodeNode"; @@ -56,7 +57,9 @@ class ExplorerNodeManager implements Disposable { } public getAllNodes(): LeetCodeNode[] { - return Array.from(this.explorerNodeMap.values()); + return this.applySortingStrategy( + Array.from(this.explorerNodeMap.values()), + ); } public getAllDifficultyNodes(): LeetCodeNode[] { @@ -114,7 +117,7 @@ class ExplorerNodeManager implements Disposable { res.push(node); } } - return res; + return this.applySortingStrategy(res); } public getChildrenNodesById(id: string): LeetCodeNode[] { @@ -142,7 +145,7 @@ class ExplorerNodeManager implements Disposable { break; } } - return res; + return this.applySortingStrategy(res); } public dispose(): void { @@ -186,6 +189,15 @@ class ExplorerNodeManager implements Disposable { break; } } + + private applySortingStrategy(nodes: LeetCodeNode[]): LeetCodeNode[] { + const strategy: SortingStrategy = getSortingStrategy(); + switch (strategy) { + case SortingStrategy.AcceptanceRateAsc: return nodes.sort((x: LeetCodeNode, y: LeetCodeNode) => Number(x.acceptanceRate) - Number(y.acceptanceRate)); + case SortingStrategy.AcceptanceRateDesc: return nodes.sort((x: LeetCodeNode, y: LeetCodeNode) => Number(y.acceptanceRate) - Number(x.acceptanceRate)); + default: return nodes; + } + } } export const explorerNodeManager: ExplorerNodeManager = new ExplorerNodeManager(); diff --git a/src/extension.ts b/src/extension.ts index 102c245f..dfd91683 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -66,6 +66,7 @@ export async function activate(context: vscode.ExtensionContext): Promise vscode.commands.registerCommand("leetcode.switchDefaultLanguage", () => switchDefaultLanguage()), vscode.commands.registerCommand("leetcode.addFavorite", (node: LeetCodeNode) => star.addFavorite(node)), vscode.commands.registerCommand("leetcode.removeFavorite", (node: LeetCodeNode) => star.removeFavorite(node)), + vscode.commands.registerCommand("leetcode.problems.sort", () => plugin.switchSortingStrategy()), ); await leetCodeExecutor.switchEndpoint(plugin.getLeetCodeEndpoint()); diff --git a/src/shared.ts b/src/shared.ts index e09943f8..84b529cc 100644 --- a/src/shared.ts +++ b/src/shared.ts @@ -116,3 +116,11 @@ export enum DescriptionConfiguration { } export const leetcodeHasInited: string = "leetcode.hasInited"; + +export enum SortingStrategy { + None = "None", + AcceptanceRateAsc = "Acceptance Rate (Ascending)", + AcceptanceRateDesc = "Acceptance Rate (Descending)", + FrequencyAsc = "Frequency (Ascending)", + FrequencyDesc = "Frequency (Descending)", +} From 068bc768c893183377d5b0f627ec6e2f28666a08 Mon Sep 17 00:00:00 2001 From: Abhishek Kathuria Date: Fri, 20 Aug 2021 01:49:14 -0700 Subject: [PATCH 2/2] Match config key casing, Update README --- README.md | 1 + package.json | 2 +- src/commands/plugin.ts | 5 ++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8292a79f..ac752c73 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,7 @@ Thanks for [@yihong0618](https://github.com/yihong0618) provided a workaround wh | `leetcode.showCommentDescription` | Specify whether to include the problem description in the comments | `false` | | `leetcode.useEndpointTranslation` | Use endpoint's translation (if available) | `true` | | `leetcode.colorizeProblems` | Add difficulty badge and colorize problems files in explorer tree | `true` | +| `leetcode.problems.sortStrategy` | Specify sorting strategy for problems list | `None` | ## Want Help? diff --git a/package.json b/package.json index fcfb64a9..bcdb5c02 100644 --- a/package.json +++ b/package.json @@ -690,7 +690,7 @@ "scope": "application", "description": "Add difficulty badge and colorize problems files in explorer tree." }, - "leetcode.problems.sort-strategy": { + "leetcode.problems.sortStrategy": { "type": "string", "default": "None", "scope": "application", diff --git a/src/commands/plugin.ts b/src/commands/plugin.ts index a461ba6b..040f8321 100644 --- a/src/commands/plugin.ts +++ b/src/commands/plugin.ts @@ -78,12 +78,11 @@ export async function switchSortingStrategy(): Promise { } const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); - await leetCodeConfig.update("problems.sort-strategy", choice.value, true); + await leetCodeConfig.update("problems.sortStrategy", choice.value, true); await leetCodeTreeDataProvider.refresh(); - vscode.window.showInformationMessage(`Switched the sorting strategy to ${choice.value}`); } export function getSortingStrategy(): SortingStrategy { const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); - return leetCodeConfig.get("problems.sort-strategy", SortingStrategy.None); + return leetCodeConfig.get("problems.sortStrategy", SortingStrategy.None); }