2015-08-18 2 views
1

У меня есть куча URIs (Strings), как это:Как извлечь базовый URI?

METRICS.COMPANY.APP1 
METRICS.COMPANY.APP1.TOTAL.90DAY 
METRICS.COMPANY.APP1.TOTAL.WEEKLY 
METRICS.COMPANY.APP1.TOTAL.MONTHLY 
METRICS.COMPANY.APP2 
METRICS.COMPANY.APP2.TOTAL.90DAY 
METRICS.COMPANY.APP2.TOTAL.WEEKLY 
METRICS.COMPANY.APP2.TOTAL.MONTHLY 
METRICS.BUSINESS.DECISIONS 
METRICS.BUSINESS.DECISIONS.MONTHLY 
METRICS.BUSINESS.DECISIONS.ANNUALLY 
METRICS.EMPLOYEE 
METRICS.EMPLOYEE.WEEKLY 

Есть ли способ, что я могу извлечь уникальные «базовый» URI из каждого набора аналогичного URIs? То есть, я заинтересован только в получении:

METRICS.COMPANY.APP1 
METRICS.COMPANY.APP2 
METRICS.BUSINESS.DECISIONS 
METRICS.EMPLOYEE 
+0

Один из способов будет 'если (s.endsWith() "WEEKLY.") s = s.substring (s.length() - 7); 'и так далее ... – immibis

+0

Я чувствую, что есть удивительный алгоритм, который может решить это. –

+0

Можете ли вы указать больше контекста на комбинацию слов. Например. TOTAL всегда перед ЕЖЕНЕДЕЛЬНЫМ/ЕЖЕМЕСЯЧНЫМ/90DAY/ANNUALLY, иначе это будет ЕЖЕНЕДЕЛЬНО/ЕЖЕМЕСЯЧНО/90DAY/ANNUALLY. – Eranda

ответ

2

Предполагая, что ваши данные будут упорядочены, как это в вашем примере, таким образом, предполагая, что основание всегда будет появляться перед своими детьми, это то, что я придумал:

private static Collection<String> extractBases(String[] nodes) { 
    Arrays.sort(nodes); // optional, to ensure order 

    Deque<String> bases = new ArrayDeque<>(); 
    bases.addFirst(nodes[0]); 

    for (int i = 1; i < nodes.length; i++) { 
     if (!nodes[i].contains(bases.peekFirst())) { // if it's not a child 
      bases.addFirst(nodes[i]); 
     } 
    } 

    return bases; 
} 

Вы можете проверить демо с входом здесь: http://ideone.com/sjEfvc

+0

Yup! Отредактировано использование 'Deque' вместо' ArrayList'. –

+0

А также добавлен шаг сортировки. –

Смежные вопросы