2015-08-31 2 views
3

У меня есть массив, как показано нижеКак инициировать счетчик, когда новый элемент добавляется

public static void main(String[] args) { 
    List asList = Arrays.asList("banner","carousel","banner","carousel","banner"); 
    Set<String> mySet = new HashSet<String>(asList); 
    for(String s: mySet){ 

    System.out.println(s + " " +Collections.frequency(asList,s)); 

    } 

} 

Выход:

carousel 2 
banner 3 

DesiredOutput:

banner0 
carousel0 
banner1 
carousel1 
banner2 

Пожалуйста, дайте мне знать, что нужно в этом случае.

+1

В вашем фрагменте кода нет счетчика. Что вы имеете в виду? – SubOptimal

+1

Если вам необходимо сохранить порядок вставки, список выглядит более подходящим, чем набор. – Keppil

+0

существует множество способов достижения требуемой функциональности, рассмотрите возможность изменения цикла 'for-each' как стандартного цикла' for' с итератором. Вы можете использовать условия if и добавить еще один цикл внутри своего внешнего цикла 'for'. –

ответ

1

Вы должны сделать это простое изменение: здесь мы делаем список суб, который считает только до текущего элемента цикла.

public static void main(String[] args) { 
     List asList = Arrays.asList("banner", "carousel", "banner", "carousel", "banner"); 
     for(int i=0;i<asList.size();i++) { 
      System.out.println(asList.get(i)+" : " + Collections.frequency(asList.subList(0,i), asList.get(i))); 
     } 
    } 

Выход:

banner : 0 
carousel : 0 
banner : 1 
carousel : 1 
banner : 2 
+0

хорошая идея. bro .. но много манипуляций. – Raghavendra

+0

thnks много .. он работает –

+0

Спасибо @Raghavendra. – StackFlowed

0

Вы можете просто перенесите метод add для печати частоты записи до добавления:

List<String> asList = Arrays.asList("banner", "carousel", "banner", "carousel", 
            "banner"); 
// ... 
Set<String> mySet = new HashSet<>(); 
for(String s : asList) { 
    addAndPrint(s, mySet); 
} 

private static final addAndPrint(String s, Collectection<String> c) { 
    System.out.println(s + " " + Collections.frequency(c, s)); 
    c.add(s); 
} 
0

Можно добиться этого с помощью карты:

public static void main(String[] args) 
    { 
     final List<String> asList = Arrays.asList("banner", "carousel", "banner", "carousel", "banner"); 
     final Map<String, Integer> map = new HashMap<String, Integer>(); 

     for (final String s : asList) 
     { 

      if (!map.containsKey(s)) 
      { 
       map.put(s, 0); 
      } 
      else 
      { 
       map.put(s, map.get(s) + 1); 
      } 
      System.out.println(s + " " + map.get(s)); 
     } 

    } 
-1

Попробуйте использовать итератор и зЬй для цикла вместо множества Cutom. Если у вас всегда есть «Карусель» и «Баннер» в качестве предметов, тогда объявляйте два счетчика и сталкивайтесь с ними, когда каждый из них встречается. Ниже приведен фрагмент

List asList = Arrays.asList("banner","carousel","banner","carousel","banner"); 
     int countb = 0; 
     int countc = 0; 
     for (int i = 0; i < asList.size(); i++) { 
      if (asList.get(i).equals("banner")) { 
       countb++; 
       System.out.print("banner"+countb+"\n"); 
      } else if (asList.get(i).equals("carousel")) { 
       countc++; 
       System.out.print("carousel"+countc+"\n"); 

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