Как я могу удалить дубликаты из списка в Groovy - PullRequest
1 голос
/ 17 февраля 2020

Привет, у меня есть groovy код для JIRA. Здесь мне нужно отсортировать или удалить дублирующееся значение из списка.

Пример:

["154515 Sawgrass",
 "170985 Mexico APIs for Payments",
 "153026 CitiCards Consumer and Business Account Online (authenticated pgs), No CSI App ID",
 "153890 GC Citibank Online - Singapore IPB v3",
 "144564 Citibank Online (CBOL) US, Zack Dummy CSI #3",
 "171706 Quip",
 "167518 GC Eclipse [Teller]",
 "167518 GC Eclipse [Signature]]",]

Выше приведен результат, откуда мне нужна сортировка, подобная ... 167518 - с этим число есть два значения, но мне нужно хранить только одно 167518, я не хочу хранить несколько значений. или, другими словами, мне нужно отсортировать список таким образом, чтобы, если число было одинаковым, но с несколькими значениями, мне нужно было хранить только 1 значение с тем же номером.

// From here Child Issue Details Starts....
def issue = event.issue as Issue
def issueManager = ComponentAccessor.getIssueManager() ;
def customField = ComponentAccessor.getComponent(CustomFieldManager).getCustomFieldObject("customfield_10602")
log.debug("Printing Custom Field : --" + customField)
def impactedAppValues = customField.getValueFromIssue(issue) as String
log.info "Printing Custom Field with Issuee Value : --" + impactedAppValues

String[] elements = impactedAppValues.split("\\s*[;]\\s*");
log.info "Printing elements with Issuee Value : --" + elements

List<String> fixedLenghtList = Arrays.asList(elements);

ArrayList<String> listOfString = new ArrayList<String>(fixedLenghtList);

log.info "Printing listOfString with Issuee Value : --" + listOfString


// From here parent Issue Details Starts....
def cf = ComponentAccessor.customFieldManager.getCustomFieldObjectByName("Parent Link")
def parentValue = issue.getCustomFieldValue(cf)
log.info "Printing parentValue value :-----" + parentValue


def planviewProjectSide =  ComponentAccessor.getComponent(CustomFieldManager).getCustomFieldObject("customfield_10602");
Issue PlanviewIssue = issueManager.getIssueObject("" + parentValue);
def parentCustomField = planviewProjectSide.getValueFromIssue(PlanviewIssue) as String
log.info "Printing parentCustomField value :-----" + parentCustomField

String[] elements1 = parentCustomField.split("\\s*[;]\\s*");
log.info "Printing elements for Parent Issuee Value : --" + elements1

List<String> fixedLenghtList1 = Arrays.asList(elements1);

ArrayList<String> listOfString1 = new ArrayList<String>(fixedLenghtList1);

log.info "Printing listOfString1 For Parent Issuee Value : --" + listOfString1

listOfString1.addAll(listOfString)
log.info "Printing listOfString1 Againnnnnnnnn For Combined Value of 1 & 2--" + listOfString1

listOfString1.unique()
log.info "Printing listOfString1 Unique Values of 1 & 2--" + listOfString1

parentCustomField = listOfString1 as String
log.info "Printing parentCustomField -----" + parentCustomField

here I have gave the code for what I have written till now.

Можно ли отсортировать как выше? Я имею в виду, что мы можем удалить дубликаты, но как удалить число из значения или строки?

Ответы [ 5 ]

1 голос
/ 18 февраля 2020

Вы можете извлечь идентификатор и поместить его в SortedMap. например,

def data = 
[ "154515 Sawgrass"
, "171706 Quip"
, "167518 GC Eclipse [Teller]"
, "167518 GC Eclipse [Signature]]" ]

println(
    data.collectEntries(new TreeMap()) {
        [it.findAll(/\d+/).first().toLong(), it]
    }
)
// → [154515:154515 Sawgrass, 167518:167518 GC Eclipse [Signature]], 171706:171706 Quip]
1 голос
/ 17 февраля 2020

Если я правильно понимаю вашу проблему, вам нужно оставить только один элемент с тем же номером (номер - это первое слово (давайте назовем его первым номером))? Во-первых, вы можете отсортировать свой список. В результате строки с одинаковым «ведущим числом» будут помещены в соседние ячейки. Затем вы можете перебирать список, извлекать «начальное число» (например, с помощью регулярного выражения) из элементов i-1 и i и, если они совпадают, просто удалить элемент i из списка.

0 голосов
/ 09 марта 2020

Исходный список:

def list = ["154515 Sawgrass",
            "170985 Mexico APIs for Payments",
            "153026 CitiCards Consumer and Business Account Online (authenticated pgs) No CSI App ID",
            "153890 GC Citibank Online - Singapore IPB v3",
            "144564 Citibank Online (CBOL) US, Zack Dummy CSI #3",
            "171706 Quip",
            "167518 GC Eclipse [Teller]",
            "167518 GC Eclipse [Signature]"]

Сначала разбейте каждый элемент и возьмите часть чисел:

def numbersList = []
list?.each {
    numbersList.add(it?.split(" ")[0]) 
}

Примените уникальное свойство:

def uniqueNumbers = numbersList.unique()

Затем для каждого уникального значения получаем данные из исходного списка:

def result = []
uniqueNumbers?.each { number ->
    result.add(list.find { it.contains(number?.toString()) })
}

Сортируем окончательные результаты:

result.sort(true)

И получаем:

144564 Citibank Online (CBOL) US, Zack Dummy CSI #3
153026 CitiCards Consumer and Business Account Online (authenticated pgs) No CSI App ID
153890 GC Citibank Online - Singapore IPB v3
154515 Sawgrass
167518 GC Eclipse [Teller]
170985 Mexico APIs for Payments
171706 Quip
0 голосов
/ 18 февраля 2020

Предположим, что мы начинаем с такого списка:

def list = ["154515 Sawgrass",
            "170985 Mexico APIs for Payments",
            "153026 CitiCards Consumer and Business Account Online (authenticated pgs) No CSI App ID",
            "153890 GC Citibank Online - Singapore IPB v3",
            "144564 Citibank Online (CBOL) US, Zack Dummy CSI #3",
            "171706 Quip",
            "167518 GC Eclipse [Teller]",
            "167518 GC Eclipse [Signature]"]

Затем мы можем начать с нового списка и набора значений:

def listUniqueValues = []
def valuesAlreadySeen = new HashSet()

Затем мы перебираем список проверяя, находится ли текущее значение в наборе «ранее увиденных» значений:

list.each { item ->
    def value = item.split(" ")[0]

    if (! valuesAlreadySeen.contains(value)) {
        listUniqueValues << item
    }

    valuesAlreadySeen << value
}

, тогда мы можем отсортировать listUniqueValues и вывести:

listUniqueValues.sort() { a,b -> a <=> b }.each { println it }

, чтобы получить

144564 Citibank Online (CBOL) US, Zack Dummy CSI #3
153026 CitiCards Consumer and Business Account Online (authenticated pgs) No CSI App ID
153890 GC Citibank Online - Singapore IPB v3
154515 Sawgrass
167518 GC Eclipse [Teller]
170985 Mexico APIs for Payments
171706 Quip

ПРИМЕЧАНИЕ: это не самый эффективный метод и не самый "Grooviest" (есть способ круче с методом inject). Но это просто и, надеюсь, легко понять.

0 голосов
/ 18 февраля 2020

Похоже, вы хотите использовать groupBy метод:

def list = ['154515 Sawgrass', '170985 Mexico APIs for Payments', '153026 CitiCards Consumer and Business Account Online (authenticated pgs)', 'No CSI App ID', '153890 GC Citibank Online - Singapore IPB v3', '144564 Citibank Online (CBOL) US', 'Zack Dummy CSI #3', '171706 Quip', '167518 GC Eclipse [Teller]', '167518 GC Eclipse [Signature]']

List result = list.groupBy{ String s ->
    String num
    s.eachMatch( /^(\d+).+$/ ){ num = it[ 1 ] }
    num
}.findResults{ String num, List<String> vals ->
    num ? vals.sort().first() : null
}

1-й groupBy называется группированием по "id" с помощью регулярного выражения, в результате вы получаете map с ключом "id" и значением списка соответствующих строк.

Затем вызывается findResults , чтобы отфильтровать несоответствующие значения, такие как 'No CSI App ID', и отсортировать списки совпадений по алфавиту и получить элемент first() (или last()) из него.

Результат будет выглядеть следующим образом:

[154515 Sawgrass, 170985 Мексиканские API для платежей, 153026 CitiCards Consumer и бизнес аккаунт в сети (аутентифицированные pgs), 153890 G C Citibank Online - Сингапур IPB v3, 144564 Citibank Online (CBOL) США, 171706 Quip, 167518 G C Eclipse [Подпись]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...