- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两种结构,Tiêu đề
VàSession
,它们都符合协议(protocol)TimelineItem
。
tôi có một cái Mảng
phụ thuộc vào TimelineItem
组成,如下所示:[Header1, SessionA, SessionB, Header2, SessionC, SessionD]
我的需要是将 Session
分组到相关的 Tiêu đề
下,如下所示:[ [Header1: [SessionA, SessionB], [Header2: [SessionC, SessionD] ]
我尝试使用lọc
方法只检索Tiêu đề
结构,并使用tách ra
方法检索Session
数组> 数组。这些工作正常,但我无法管理如何协调两者以构建我的最终 [[Header: [Session]]]
对象。
这是我的示例代码:
enum TimelineItemType: String {
case Header = "header"
case Session = "session"
}
protocol TimelineItem {
var id: Int { get }
var type: TimelineItemType { get }
var startDate: NSDate { get }
}
Tiêu đề
结构
struct Header: TimelineItem, Decodable, Hashable, Equatable {
cho id: Int
let type: TimelineItemType = .Header
let startDate: NSDate
let text: String
init?(json: JSON) {
guard let id: Int = "id" <~~ json,
let type: TimelineItemType = "type" <~~ json,
let startDate: NSDate = "startDate" <~~ json,
let text: String = "text" <~~ json where type == .Header else {
trả về nil
}
self.id = id
self.startDate = startDate
self.text = text
}
var hashValue: Int {
// As id is unique, we can use it for hash purpose
return id
}
}
Session
结构
struct Session: TimelineItem, Decodable, Equatable {
cho id: Int
let type: TimelineItemType = .Session
let startDate: NSDate
hãy đặt tên: Chuỗi
let syllabus: String
let speaker: Speaker
cho ngôn ngữ: Chuỗi
let room: String
let duration: Int
init?(json: JSON) {
guard let id: Int = "id" <~~ json,
let type: TimelineItemType = "type" <~~ json,
let startDate: NSDate = Decoder.decodeDateISO8601("startDate")(json),
let name: String = "name" <~~ json,
let speaker: Speaker = "speaker" <~~ json,
let syllabus: String = "syllabus" <~~ json,
let language: String = "language" <~~ json,
let room: String = "room" <~~ json,
let duration: Int = "duration" <~~ json where type == .Session else {
trả về nil
}
self.id = id
self.startDate = startDate
self.name = name
self.speaker = speaker
self.syllabus = syllabus
self.language = language
self.room = room
self.duration = duration
}
}
最后是我尝试拆分数组的代码:
func timelineFromItems(timelineItems: [TimelineItem]) -> [[Header: [Session]]]? {
let slicedSessions = timelineItems.split { $0 is Header }
let sessions = Array(slicedSessions)
let headers = timelineItems.filter { $0.type == .Header }
var timeline = [[Header: [Session]]]()
// HOW TO FILL THE TIMELINE ??
}
如何填写时间表?
câu trả lời hay nhất
我通过删除所有不必要的信息来减少这个例子
protocol P {}
struct A: P, Hashable {
var i:Int
var hashValue: Int { return i }
}
func ==(lhs: A, rhs: A)->Bool {
return lhs.i == rhs.i
}
struct B: P {
var i:Int
}
// your current data
let arr:[P] = [A(i: 1),B(i: 1),B(i: 2), A(i: 2), B(i: 3), B(i: 4), B(i: 5)]
将数据转换为所需格式的函数
func foo(arr: [P])->[[A:[B]]]? {
var dict:[A:[B]] = [:]
var arrb:[B] = []
let arrk:[A] = arr.filter { $0 is A }.map { $0 as! A }
guard var key = arr[0] as? A else { return nil }
arr.forEach { (p) in
if let a = p as? A {
dict[key] = arrb
arrb = []
key = a
}
if let b = p as? B {
arrb.append(b)
}
}
dict[key] = arrb
var arrr:[[A:[B]]] = []
arrk.forEach { (a) in
if let arrb = dict[a] {
arrr.append([a:arrb])
}
}
return arrr
}
现在生成的数组符合您的要求(我希望 :-))
if let result = foo(arr) {
print(result) // [[A(i: 1): [B(i: 1), B(i: 2)]], [A(i: 2): [B(i: 3), B(i: 4), B(i: 5)]]]
}
另一个测试数据
let arr:[P] = [A(i: 1),B(i: 1),B(i: 2), A(i: 2), A(i: 3), B(i: 3)]
给你
[[A(i: 1): [B(i: 1), B(i: 2)]], [A(i: 2): []], [A(i: 3): [B(i: 3)]]]
所以,即使 A 后面没有 B,它也能工作
关于ios - Swift:将 [A, B, B, B, A, B, B, B] 数组转换为哈希数组 [ [A: [B, B, B], [A: [B, B, B] ] ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35474735/
Tôi có hai cấu trúc, Tiêu đề và Phiên, cả hai đều tuân theo giao thức TimelineItem. Tôi có một mảng bao gồm TimelineItem như thế này: [Header1, S
Câu hỏi này đã có câu trả lời ở đây: Thứ tự phân công và đánh giá nhiều lần trong Python (11 câu trả lời) Đã đóng 6 năm trước. Mình mới làm quen với python nên muốn hỏi bạn
Tôi đang cố gắng tìm cách lấy danh sách tất cả các hoán vị duy nhất có thể có của A, A, A, A, B, B, B, B, B trong R. Sự kết hợp ban đầu được hình thành như một phương pháp để có được giải pháp, do đó là sự kết hợp của các câu trả lời. Câu trả lời hay nhất Tôi nghĩ đây chính là điều bạn đang theo đuổi. @bil
Làm cách nào tôi có thể trộn hai vectơ đã cho thành một vectơ mới chứa các giá trị của chúng theo thứ tự xen kẽ. (f [aa] [bb]) ; > [abab] Đây là những gì tôi nghĩ ra: (làm phẳng (vectơ bản đồ [:a
Đây là câu hỏi đầu tiên của tôi khi bắt đầu học Python. Có sự khác biệt nào giữa: a, b = b, a + b và a = bb = a + b Khi bạn viết vào ví dụ dưới đây sẽ ra kết quả khác nhau. def fib(n):
Câu hỏi này đã có câu trả lời ở đây: Tại sao lại có tên lớp được chèn vào? (1 câu trả lời) Đã đóng 12 tháng trước. Tôi không biết giải thích thế nào: namespace A {struct
Tôi đã thử một số mã để hoán đổi hai số nguyên trong Java mà không sử dụng biến thứ ba, sử dụng XOR. Đây là hai hàm hoán đổi mà tôi đã thử: package lang.numeric public class SwapVars;
Giả sử lớp B kế thừa lớp A và tôi muốn khai báo một biến cho lớp B. Điều gì hiệu quả hơn? Tại sao? B b hoặc A b . Câu trả lời hay nhất Bạn đang nhầm lẫn giữa hai khái niệm khác nhau. lớp B mở rộng A { } có nghĩa là B là A .
Tôi không chắc tiêu đề của câu hỏi này là gì, đây cũng có thể là một câu hỏi trùng lặp. Vì vậy xin vui lòng hướng dẫn cho phù hợp. Tôi mới làm quen với lập trình python. Tôi có mã đơn giản này để tạo số Fibonacci. 1: def fibo(n): 2: a =
Tôi đã tìm hiểu về Dynamic_cast và tôi thấy rằng việc truyền rõ ràng một đối tượng lớp cơ sở tới một con trỏ lớp dẫn xuất có thể không an toàn. Nhưng khi tôi chạy một số mã mẫu để kiểm tra thì tôi không gặp bất kỳ lỗi nào. Vui lòng tìm mã của tôi dưới đây: lớp
Câu hỏi này đã có câu trả lời ở đây: Cú pháp dấu hai chấm kỳ lạ (" : ") này trong hàm tạo là gì? (14 câu trả lời) Đã đóng 8 năm trước.
Cách thành ngữ để đạt được những điều sau đây mà không tạo ra các biểu thức tạo ra các giá trị không nguyên (trong trường hợp thực tế của tôi, giá trị được tính bằng phần trăm sau một truy vấn dài mà tôi không muốn sao chép): CHỌN * TỪ SOMETable Ở ĐÂU 1/
Trong sự hủy diệt, kết quả của hai mã này thực sự khác nhau. Tôi không chắc tại sao. Mẹo nói rằng const [b,a] = [a,b] sẽ khiến giá trị của a,b không được xác định (quy tắc gán đơn giản từ trái sang phải). Tôi không hiểu tại sao điều này lại xảy ra. tôi
Mẫu C++ - Hướng dẫn đầy đủ, Phiên bản thứ 2 Hướng dẫn sử dụng max: template T max (T a, T b) { // if b < a th
Gần đây tôi đã bắt đầu học viết mã (Java) và tra cứu toán tử modulo trên trang web của Oracle dựa trên Phần 15.17.3. Liên kết sau: http://docs.oracle.com/javase/specs/jls/se8/
Không thể hiểu được hành vi sau đây. Sự khác biệt giữa d1 := &data{1}; và d2 := data{1}; Cả hai đều là con trỏ, phải không? Nhưng họ cư xử khác nhau. Điều gì đang xảy ra ở đây gói nhập chính "f
Câu hỏi này đã có câu trả lời ở đây: Cách tạo vòng lặp vô hạn với "x = y && x != y" (4 câu trả lời) Làm cách nào để xác định biến?
Trong chương trình của tôi, khi tôi gỡ lỗi mã của mình, có vẻ như ở đâu đó trong mã được tạo của tôi X1=['[a,a,a]','[b,b,b]'] và ở những nơi khác tôi tạo X2=[[a ,a,a],[b,b,b]] khi tôi muốn thêm hai cột này tất nhiên
Tôi đang cố nhân hai số nguyên bằng cách sử dụng đệ quy và vô tình viết mã này: // phiên bản gốc int Multi(int a, int b) { if ( !b ) retu
Tôi có một danh sách tất cả các kết hợp hoạt động có thể có giữa các số: list = ['2','7','8'] 7+8*2 8+7*2 2*8+7 2+8*7 2 - 8*7 8-2/7 v.v. Tôi tự hỏi liệu có thể nói điều gì đó như ('7*2+
Tôi là một lập trình viên xuất sắc, rất giỏi!