Comparing Strings Not in the Same Order

Here is another situation that needed to be solved. I want to compare the name of a company from one page, to the company name that appears on their profile to make sure they are the same. The problem comes in because the names aren't listed the same way in both places.

On the first page, the name can be listed as:

Good, Johnny B

On the next page, it can be listed as:

Johnny B. Good

However, that's not always the case. In some cases the full company name can be listed in both places such as:

Amalgamated Beverage Coop

Reversing the order or switching around the last word isn't always correct. So the question is, how can these two strings be compared even though they aren't in the same order? Built in functions like equal, contains, matches, and compareTo won't work correctly.

If you go searching, there are several possible solutions. Some look relatively reliable, while others look overly complex. But based on several common theories, it looks like a reasonable solution is to break the words apart then do the comparison. That turns out to be pretty straightforward and can be done in a few steps.

I don't know if this solution borders on being clever, or stands right in the middle of total hackery. I tested it against multiple examples, and it did work, so here goes.

If you notice above, there is a "," in the first example and a "." in the second. But, they are not common to each other. The first order of business is to use replaceAll so we only have text to work with. We need to remove everything that isn't a letter of the alphabet or the space between words.

.replaceAll("[^a-zA-Z ]","")

Next, the words need to parsed into blocks so they can be compared. This can be done using the .split() command. In this case, split on the space that exists between each word. For this example, we will get 3 results.

.split(" ")

Finally, the words need to be sorted so they can be compared correctly:

.sort()

This creates, "Johnny", "B", "Good" for both strings, which is then turned into, "B", "Good", "Johnny" for both. A comparison of that will shown as the same. Even when the company name is in the same order, it is still broken apart, but the same words exist for each. That should be considered a match.

Keep in mind this won't be 100% accurate 100% of the time. It will be possible for two different companies to use the same words in a different order. However, that is a corner case and this solution still works for 90% of the situations.

List company1
List company2
company1=WebUI.getText(findTestObject('Company Name 1').replaceAll("[^a-zA-Z ]","").split(" ").sort()
company2=WebUI.getText(findTestObject('Company Name 2').replaceAll("[^a-zA-Z ]","").split(" ").sort()

if (company1!=company2){
    log.logError("ERROR: The Company Name for this profile does not match")
    KeywordUtil.markFailed("ERROR: The Company Name for this profile does not match")
}

Other articles of interest:

Leave a Reply

Your email address will not be published. Required fields are marked *

Recent Comments
  • How To Disable the Quicken Registration Prompt (30)
    • David: A BIG Thank you! I regularly reinstall Windows OS’s using different hardware configs. In short, Quicken 2011 (it’s March of 2020 as I write this) has been a program I’ve been very happy with and continue to use....
    • Karen L: Today I rang Reckon Australia again, got a different guy and he talked me through the process of getting me a new product key to enter since I already had the licence and it had been extended. Reckon have only extended it by 1...
    • Karen L: I have Australian Quicken 2008 on Windows 8.1. It keeps asking me to renew my licence which Reckon did for me however the activation won’t work. I tried this to disable the registration prompt however it did not stop the...
  • Parsing Strings in Katalon – Split, Substring and Readlines (6)
    • Don Pedro: String tempText=”Date Month January. Revenue $1,355,721.00″ println(tempText.split(“ \$”)[1]) You need to escape the $ with \$ The [1] on the split captures characters on the right of the split [0]...
    • Prasad: Hi, I need to get the substring from the below string ‘Date Month January. Revenue $1,355,721.00’ I want to extract text after $ value. Please help Thank you
  • Working with Dates and Date Formatting in Katalon Studio (15)
    • Sangeethaa: How to get previous day’s date(Yesterday’s date)? Actually I was using today.previous() before,it was working fine till today morning.Now its not retrieving right date. Can anyone please guide me on this.
    • Don Pedro: That could be a little tricky. First, is the text/format always going to be the same? You will need to do some parsing. Separate the first but of text at 2019. After that, split the text again to get rid of Central Standard...
    • Don Pedro: It should be of the same Date type as today. You could then do some calendar trickery with Calendar /*Calendar c = Calendar.getInstance(); //c.set(Calendar.MONTH, 1) //Set the month, 0=January, 11=December println...
    • josh: I’m testing a page with a string like “Updated November 21, 2019 16:25:32 PM Central Standard Time.” How might I capture the date and time and compare it to current time to verify that the update time was within...
    • zakir hussain: today = new Date() lastWeek = (today – 1.week) can u please help me in understanding what is the return type of lastweek? and I wanted to set nextyear date how can i do it
  • Output status messages and test information by writing to the Log File Viewer in Katalon Studio (6)
    • Saranya: Good One. Could you plz share link to access all your katalon related blogs. ThankQ
    • Rodrigo Calabretta: I’m using the KeywordUtil.markFailed or KeywordUtil.markError and my test stops is being shown as Error and If I use in the @afterTestCase the testCaseContext.getTestCaseSta tus() to show the status test case...
  • Setting up Environment Profiles in Katalon Studio (2)
    • Don Pedro: Not quite sure I understand. The term “Execution Profile” is normally used now, but they are still GlobalVariables and are created in the same way for version 7 as previous. You make a new execution profile, then...
  • Here is my drive cluster (2)
    • Don Pedro: While I still have those drives, the drive cluster looks nothing like that now. Almost all of my external drives have had the cases removed and they have been installed into a series of MediaSonic 8 Bay Drive Enclosures. I...
    • Marin Boucher: Hi! Verry funny blog with “go to the point” on many post! I spent good time reading some of your post. Regarding this one about NAS, “many NAS” in fact, I would be curious to see a screenshot of...