Как перебрать связанный хэш-сет и сравнить каждые 2 элемента в текстовом файле в Java? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть несколько элементов в наборе связанных хэшей. Пример
карандаш, ручка, ластик, масштаб
Сначала я хочу получить доступ (карандаш, ручка) и выполнить некоторые операции. Затем я хочу получить доступ (карандаш, ластик), затем (карандаш, масштаб) и т. Д.
Я написал код, который может получить доступ к первым двум элементам, но на следующей итерации он обращается к ластику, масштабу вместо карандаша, ластику. Пожалуйста, помогите мне найти это решение. Благодарю. Это часть кода, которую я сделал до сих пор:

    LinkedHashSet<String> freq = new LinkedHashSet<String>();  
    /* Linked hashset has these items :  
    [pen,pencil,eraser,scale] */  
    String item;  
    String item2;  
    Iterator<String> itr = freq.iterator();  
    while (itr.hasNext()) {  
        item = itr.next();  
        System.out.println(item);  
        item2=itr.next();  
        System.out.println(item2);
        // perform some task  
    }

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Код:

    Iterator<String> iterator = set.iterator();
    String pencil = iterator.next();
    while (iterator.hasNext()) {
        System.out.println(pencil);
        System.out.println(iterator.next());
    }

Выход:

pencil
pen
pencil
eraser
pencil
scale
0 голосов
/ 09 сентября 2018

Не уверен, как это сделать с ArrayLists в java, но вы можете преобразовать его в массив из массива в hashmap, так как вы можете считать события, используя этот метод. вот что я бы сделал.

import java.util.ArrayList;
    import java.util.List;
    import java.util.HashMap; 
    import java.util.Map; 
    import java.util.Map.Entry; 
    import java.util.*; 

    public class Sample
    {

         public static void main(String []args){
            ArrayList<String> arrayList = new ArrayList<>();
            arrayList.add("Pencil");
            arrayList.add("Pencil");
            arrayList.add("Bulb");
            arrayList.add("Scale");
            arrayList.add("Pencil");
            arrayList.add("Pencil");
            arrayList.add("Scale");
            arrayList.add("Eraser");

            countListItems(arrayList);

         }

        public static void countListItems(ArrayList<String> list) 
        { 
            Map<String, Integer> map = new HashMap<String, Integer>(); 

            for (String x : list) 
            { 
                Integer y = map.get(x); 
                map.put(x, (y == null) ? 1 : y + 1); 
            } 

            for (Entry<String, Integer> item : map.entrySet()) { 
                System.out.println(item.getKey()+" -> count="+ item.getValue()); 
            }
        } 
    }
0 голосов
/ 04 сентября 2018

Я не знаю, правильно ли я понимаю, что вы хотите, но требуемый цикл должен выполняться с использованием вложенного цикла, рассмотрите следующий код:

public static void main(String[] args) {
    LinkedHashSet<String> freq = new LinkedHashSet<String>();
    freq.add("pen");
    freq.add("pencil");
    freq.add("eraser");
    freq.add("scale");

    for (String item : freq) {
        performeOperation(item, freq);
    }
}

private static void performeOperation(String primeItem, LinkedHashSet<String> freq) {
    for (String secondItem : freq) {
        if (primeItem != secondItem) {
            System.out.println(primeItem + ", " + secondItem);
        }
    }
}

Пример вывода:

pen, pencil
pen, eraser
pen, scale
pencil, pen
pencil, eraser
pencil, scale
eraser, pen
eraser, pencil
eraser, scale
scale, pen
scale, pencil
scale, eraser

Если вам не нужны повторяющиеся пары, используйте это:

public static void main(String[] args) {
    LinkedHashSet<String> freq = new LinkedHashSet<String>();
    LinkedHashSet<String> param = new LinkedHashSet<String>();
    freq.add("pen");
    freq.add("pencil");
    freq.add("eraser");
    freq.add("scale");
    param.addAll(freq);

    for (String item : freq) {
        param.remove(item);
        performeOperation(item, param);
    }
}

private static void performeOperation(String primeItem, LinkedHashSet<String> param) {
    for (String secondItem : param) {
        System.out.println(primeItem + ", " + secondItem);
    }
}

Пример вывода:

pen, pencil
pen, eraser
pen, scale
pencil, eraser
pencil, scale
eraser, scale

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

public static void main(String[] args) {
    LinkedHashSet<String> freq = new LinkedHashSet<String>();
    freq.add("pen");
    freq.add("pencil");
    freq.add("eraser");
    freq.add("scale");

    for (String item : freq) {
        performeOperation(item, freq);
    }
}

private static void performeOperation(String primeItem, LinkedHashSet<String> param) {
    boolean flag = false;
    for (String secondItem : param) {
        if (flag) {
            System.out.println(primeItem + ", " + secondItem);
        } else if (primeItem.equals(secondItem)) {
            flag = true;
        }
    }
}
...