Menu
Coddy logo textTech

מיון לפי מפתח

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 38 מתוך 64.

order(x) מחזירה את המיקומים שיסדרו את x: קודם המיקום של הערך הקטן ביותר, אחר כך של הערך הבא, וכן הלאה. השתמשו בה כדי לאנדקס וקטור אחר ולסדר את הווקטור לפי x:

names <- c("cy", "ada", "bo")
ages <- c(41, 36, 22)
print(order(ages))
print(names[order(ages)])

פלט:

[1] 3 2 1
[1] "bo"  "ada" "cy" 

לסדר יורד, העבירו decreasing = TRUE, או הוסיפו סימן מינוס לפני מפתח מספרי:

names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(scores, decreasing = TRUE)])
print(names[order(-scores)])

פלט:

[1] "ada" "cy"  "bo" 
[1] "ada" "cy"  "bo" 

העבירו ל־order() מפתח שני כדי לשבור שוויון. כאן הציונים ממוינים מהגבוה לנמוך, וציונים שווים ממוינים לפי שם:

names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(-scores, names)])

פלט:

[1] "ada" "bo"  "cy" 

order() שומרת על הסדר המקורי של ערכים שווים כאשר לא ניתן מפתח שני. אותם מיקומים יכולים לסדר מחדש כמה וקטורים ששייכים יחד:

items <- c("tea", "jam", "oil")
price <- c(4, 2.5, 4)
qty <- c(1, 6, 3)
idx <- order(price)
print(items[idx])
print(qty[idx])

פלט:

[1] "jam" "tea" "oil"
[1] 6 1 3
challenge icon

אתגר

קל

השלם את ranking(names, scores). החזר שורה אחת לכל שחקן, 1. ada 95, מהניקוד הגבוה ביותר לנמוך ביותר. שחקנים עם אותו ניקוד מופיעים בסדר אלפביתי.

הקוד שסופק קורא את השחקנים כזוגות name:score המופרדים בפסיקים ומדפיס כל שורה שהוחזרה.

נסו בעצמכם

ranking <- function(names, scores) {
  # כתבו את הקוד שלכם כאן
  character(0)
}

# קוד קלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
pairs <- strsplit(strsplit(input[1], ",")[[1]], ":")
names <- sapply(pairs, function(p) p[1])
values <- as.numeric(sapply(pairs, function(p) p[2]))
cat(ranking(names, values), sep = "\n")
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר R אונליין