0

I am having a class like this:

class JobMembers {
    
    var key: String?
    let memberJob: String?
    let memberName: String?
    let memberID:String?
    let normalPrice:Double?
    var sumFreelanceRating:Double!
    let priceJPerfScore:Double?
    
        
    
    init(sumFreelanceRating:Double, normalPrice:Double, memberJob: String, memberName: String, priceJPerfScore:Double, memberID:String) {
            
        self.sumFreelanceRating = sumFreelanceRating
        self.normalPrice = normalPrice
        self.memberName = memberName
        self.memberJob = memberJob
        self.priceJPerfScore = priceJPerfScore
        self.memberID = memberID
  
        }
    
    
    var dictValue: [String: Any] {
        
        return ["memberName" : memberName,
                "memberJob" : memberJob,
                "normalPrice": normalPrice,
                "sumFreelanceRating" : sumFreelanceRating,
                "priceJPerfScore": priceJPerfScore,
                "memberID": memberID]
    }
   
}

and initialise an Array and populate it for testing purposes like this:

var freelancerArray = [JobMembers]()

var member1JP = JobMembers(sumFreelanceRating: 35.6, normalPrice: 4.4, memberJob: "Tennis", memberName: "Aggazzi", priceJPerfScore: 2.2, memberID: "-FG84832iMV0Seznf-D" )

var member2JP = JobMembers(ajp: 2.3, crea: 3.4, ijr: 4.5, qpa: 5.6, coj: 6.7, los: 1.3, iracc: 2.4, dph: 4.8, sumFreelanceRating: 31.0, normalPrice: 6.84, memberJob: "Fussball", memberName: "Mueller", priceJPerfScore: 172.0, memberID: "-MA6VScOQiMV0Seznf-D")

var member3JP = JobMembers(sumFreelanceRating: 41.9, normalPrice: 5.5, memberJob: "Fussball", memberName: "Schweinsteiger", priceJPerfScore: 140.0, memberID: "-FF6666QiMV0Seznf-D")

var member4JP = JobMembers(sumFreelanceRating: 38.7, normalPrice: 3.3, memberJob: "Tennis", memberName: "Federer", priceJPerfScore: 170.0, memberID: "-FA874506QiMV0Seznf-D")

var member5JP = JobMembers(sumFreelanceRating: 36.7, normalPrice: 5.3, memberJob: "Tennis", memberName: "Becker", priceJPerfScore: 125.0, memberID: "-FE3454506QiMV0Seznf-D")

var member6JP = JobMembers(sumFreelanceRating: 32.5, normalPrice: 4.4, memberJob: "Tennis", memberName: "Williams", priceJPerfScore: 4.2, memberID: "-ADE3344506QiMV0Seznf-D")

var member7JP = JobMembers(sumFreelanceRating: 37.6, normalPrice: 2.8, memberJob: "Fussball", memberName: "Woods", priceJPerfScore: 5.8, memberID: "-GHI4564506QiMV0Seznf-D")

var member8JP = JobMembers(sumFreelanceRating: 36.6, normalPrice: 4.4, memberJob: "Golf", memberName: "Spieth", priceJPerfScore: 4.4, memberID: "-FGI4564506QiMV0Seznf-D")

var member9JP = JobMembers(sumFreelanceRating: 28.09, normalPrice: 2.8, memberJob: "Skate", memberName: "Dixon", priceJPerfScore: 2.8, memberID: "-4204564506QiMV0Seznf-D")
freelancerArray.append(member1JP)
freelancerArray.append(member2JP)
freelancerArray.append(member3JP)
freelancerArray.append(member4JP)
freelancerArray.append(member5JP)
freelancerArray.append(member6JP)
freelancerArray.append(member7JP)
freelancerArray.append(member8JP)
freelancerArray.append(member9JP)

I have another class which represents the users choice of how many membershe needs from a specific memberJob:

class JobAmount {
    var key: String?
    let jobName: String?
    let jobAmount: Int?
    
    init(jobName: String, jobAmount: Int) {
        self.jobName = jobName
        self.jobAmount = jobAmount
    }
    var dictValue: [String: Any] {
    
    return ["jobName" : jobName,
            "jobAmount" : jobAmount ]
        
    }
}

For testing purposes I populated an array like this:

var jobsNeeded:[JobAmount] = []

var jobNeeded1 = JobAmount(jobName: Tennis, jobAmount:3)
var jobNeeded2 = JobAmount(jobName: Fussball, jobAmount2


What do I want to achieve with this?

The goal should be to fill an array which has the following requirements:

  • For the required jobAmount of the respective JobNames, add the members in a new array which has the highest value of sumFreelanceRating for the required JobName.

My approach so far

I tried different solutions from this forum, looked up the swift documentations etc. but couldn't find a proper solution that fits for me.

I am assuming that a good way to go is:

(1) sort the freelancerArraylike follow: freelancerArray.sort(by: {$0.sumFreelanceRating > $1.sumFreelanceRating})

(2) Filter the freelancerArrayin a temporaryArraycontaining only the objects for the specific memberJob

(3) Append the number of needed values in a final Array (for i in 0..<jobName.jobAmount, something like JobRequirementArray, where all the memberswhich are needed get stored.

For Step 2 and 3 it must be obviously done for every memberJob the User needs. Which and how many memberJobsit is going to be is unknown in advance.

Edit Pursued outcome:

let finalJobsneeded:[JobMembers]()

Then the array should contain following JobMembers:

finalJobsneeded = [member1JP, member3JP, member4JP, member5JP, member7JP]

As you can see, we need 5 Members in total, whereby 2 of them must contain the memberJob: Fussballand also have the highest value of sumFreelanceRating for all alternatives of memberJob: Fussball. The other 3 Members should contain the memberJob: Tennisand also have the highest value for all alternatives of memberJob: Tennis

I hope my explanation of my little Problem was clear enough and someone could help me bringing my ideas into actual code!

Thanks for your help everyone :)

3
  • Yeah true that! I tried something, so I changed it as a String. Will change it. I didn't show sample data, since I didn't want to overload the question! I will change my question and hope you can work with that then! :) Commented Aug 3, 2020 at 12:53
  • Unrelated but it's pointless to declare properties as optional which are clearly initialized with non-optional values. Surprisingly the code compiles also without the question marks. And do you really need classes? Commented Aug 3, 2020 at 13:03
  • I don't need classes! Structures are also okay. The goal is the goal ;) Commented Aug 3, 2020 at 13:08

2 Answers 2

1

First create a dictionary to hold the selected elements

var selected = [String: [JobMembers]]()

Then use a forEach loop to filter out the members with the right job name. Since this is done per job we can at the same time sort and select only the required number.

jobsNeeded.forEach { job in
    selected[job.jobName, default: []].append(contentsOf:
        freelancerArray
            .filter { job.jobName == $0.memberJob}
            .sorted { member1, member2 in member1.sumFreelanceRating > member2.sumFreelanceRating}
            .prefix(job.jobAmount)
    )
}

If you want all members in one array you can use flatMap on the dictionary values

let selectedMembers = selected.values.flatMap({$0})
Sign up to request clarification or add additional context in comments.

Comments

0

In case someone is trying to achieve the same. This works for me now!

func tryToGetIt() {
 var temp1: [JobMembers] = []
    for jobAmount in jobAmountArray{
        temp1 = freelancerArray.filter { $0.memberJob == jobAmount.jobName}
        temp1.sort(by: {$0.sumFreelanceRating > $1.sumFreelanceRating})
        for value in temp1{
            print("temp1: ")
            print(value.memberName as Any)
        }
        let neededValue = jobAmount.jobAmount
        print("needed Value: ", neededValue as Any, "for Job: ", jobAmount.jobName as Any)
        let deletValue = temp1.count - neededValue!
        print("delet Value: ", deletValue)
        temp1.remove(0..<deletValue)
        
        for member in temp1 {
            print("memberName: ", member.memberName as Any, "memberJob: ", member.memberJob as Any, "memberID: ", member.memberID  as Any, "memberJP: " as Any, member.sumFreelanceRating as Any)
        }
        print(temp1.count)
        
            
        for value in temp1 {
            finalBest.append(value)
        }
        
        print("\n \n")
    }
    for member in finalBest {
        print("memberName: ", member.memberName as Any, "memberJob: ", member.memberJob  as Any, "memberID: " as Any, member.memberID as Any, "memberJP: ", member.sumFreelanceRating as Any)
        print(finalBest.count)
    }
    print("final Best: ", finalBest)
    print("final Best amount: ", finalBest.count)
}

2 Comments

What is WeighScore and where is finalBest declared?
Sorry WeighScorewas an old name, now changed it to the one in my initial question!. finalBest is just an Array of var finalBest = [JobMembers](), where I am storing the output outside of the function

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.