Ява падлічваць з'яўленне кожнага элемента ў адсартаваным масіве

У мяне ёсць масіў радкоў і хачу, каб падлічыць лік уваходжанняў якой-небудзь адной радкі.

Я ўжо адсартаваны яго. (Гэта доўгі масіў, і я хацеў пазбавіцца ад O (N²) -loop)

Вось мой код .. Відавочна, ён выбягае ў ind.outOfB. отл .. прычына ясная, але я Donno як вырашыць ..

for (int i = 0; i < patternsTest.length-1; i++) {
        int occ=1;
        String temp=patternsTest[i];
        while(temp.equals(patternsTest[i+1])){
            i++;
            occ++;
        }
    }
3
Вы не хочаце выкарыстоўваць карту для павышэння эфектыўнасці? сартавання вы губляеце на шмат efficiecy, каб пачаць з таго, з дапамогай карты азначае, што вам не трэба сартаваць пошту перад адпраўкай на паштамт. Але калі вы сапраўды не хочаце выкарыстоўваць карту толькі растлумачыць прычыны, ці я думаю, проста так сказаць :)
дададзена аўтар greedybuddha, крыніца
Вы не хочаце выкарыстоўваць карту для павышэння эфектыўнасці? сартавання вы губляеце на шмат efficiecy, каб пачаць з таго, з дапамогай карты азначае, што вам не трэба сартаваць пошту перад адпраўкай на паштамт. Але калі вы сапраўды не хочаце выкарыстоўваць карту толькі растлумачыць прычыны, ці я думаю, проста так сказаць :)
дададзена аўтар greedybuddha, крыніца
Чаму б не выкарыстоўваць Map ?
дададзена аўтар Franklin, крыніца
Чаму б не вы? Было б хутчэй і прасцей змяніць у будучыні.
дададзена аўтар Franklin, крыніца
Мне патрэбныя сырыя лічыльнікі .. я не ведаю, калі я б стварыць карту толькі для гэтага ...
дададзена аўтар Jan S, крыніца
Мне патрэбныя сырыя лічыльнікі .. я не ведаю, калі я б стварыць карту толькі для гэтага ...
дададзена аўтар Jan S, крыніца

11 адказы

Гэта было б добрае месца для HashMap, ключ будзе Словам, і значэнне колькасці раз гэта адбываецца. <�Код> Map.containsKey і Map.get метады з'яўляюцца пастаяннымі пошукамі часу, якія вельмі хутка.

Map map = new HashMap();
for (int i = 0; i < patternsTest.length; i++) {
    String word=patternsTest[i];
    if (!map.containsKey(word)){
        map.put(word,1);
    } else {
        map.put(word, map.get(word) +1);
    }
}

Як пабочны эфект, вы нават не трэба загадзя разабрацца!

11
дададзена
З апошняга адказу (што вы выдалілі, так што я не магу гэта каментаваць): IMO пытанне можа быць адкрытым і адказаў, але не даючы прамой код або прамалінейна дае рашэнне, замест таго, каб кіраваць OP, каб зразумець, як вырашыць гэтую праблему. Калі ласка, звярніцеся да Як задаваць пытанні і адказваць на пытанні хатняга задання? .
дададзена аўтар Luiggi Mendoza, крыніца
Ён ужо паказаў некаторы высілак і код, які зрабіў гэта нашмат менш наступ у маіх вачах. даючы камусьці алгарытм з'яўляецца справядлівым намёкам имо, але ў гэтым выпадку алгарытм мае так шмат рашэнняў, яго трывіяльны знайсці, таму я проста дадаў яго. У рэшце рэшт, я з вамі згодны, таму я выдаліў адказ. Гэта проста раніцай тут, а часам я проста іду на аўтапілоце;) добрая сувязь, хоць, я буду выкарыстоўваць гэта ў будучыні, каб каментаваць пытанні, як гэты
дададзена аўтар greedybuddha, крыніца
Наколькі эфектыўна вы шукаеце? Вы можаце зрабіць гэта крыху хутчэй, з дадатковай радком коды, калі вы хочаце, каб я змясціў гэтую версію да замест гэтага
дададзена аўтар greedybuddha, крыніца
ContainsKey ўяўляе сабой Аб (1) пошук. Гэта азначае, што не будзе перабіраць ўсю карту, гэта больш падобна на індэксаванне ў масіў, чым поўны перабор. Я буду абнаўляць адказ з гэтым, а таксама.
дададзена аўтар greedybuddha, крыніца
Гэта добры адказ, але я хацеў бы змяніць аб'яву на бацькоўскі клас Map карта = новы HashMap (); amazon.com/Effective-Java-2nd-Joshua-Bloch/ пп/0321356683
дададзена аўтар spuder, крыніца
але зрабіце .containsKey() ітэрацыю па ўсёй карце? і існуючая запіс будзе перапісаная кожны раз ..? здаецца неэфектыўным гэты шлях .. Не кажу, што гэта дрэнна .. Падыход
дададзена аўтар Jan S, крыніца
Добры пытанне: P .. кожны шукаў самы хуткі, ці не так? ;) Яго настолькі далёка .. Я думаю, што версія Workin майго падыходу будзе павальнейшай .. з усёй упарадкавана і л. Вялікі дзякуй :)
дададзена аўтар Jan S, крыніца

Гэта было б добрае месца для HashMap, ключ будзе Словам, і значэнне колькасці раз гэта адбываецца. <�Код> Map.containsKey і Map.get метады з'яўляюцца пастаяннымі пошукамі часу, якія вельмі хутка.

Map map = new HashMap();
for (int i = 0; i < patternsTest.length; i++) {
    String word=patternsTest[i];
    if (!map.containsKey(word)){
        map.put(word,1);
    } else {
        map.put(word, map.get(word) +1);
    }
}

Як пабочны эфект, вы нават не трэба загадзя разабрацца!

11
дададзена
З апошняга адказу (што вы выдалілі, так што я не магу гэта каментаваць): IMO пытанне можа быць адкрытым і адказаў, але не даючы прамой код або прамалінейна дае рашэнне, замест таго, каб кіраваць OP, каб зразумець, як вырашыць гэтую праблему. Калі ласка, звярніцеся да Як задаваць пытанні і адказваць на пытанні хатняга задання? .
дададзена аўтар Luiggi Mendoza, крыніца
ContainsKey ўяўляе сабой Аб (1) пошук. Гэта азначае, што не будзе перабіраць ўсю карту, гэта больш падобна на індэксаванне ў масіў, чым поўны перабор. Я буду абнаўляць адказ з гэтым, а таксама.
дададзена аўтар greedybuddha, крыніца
Ён ужо паказаў некаторы высілак і код, які зрабіў гэта нашмат менш наступ у маіх вачах. даючы камусьці алгарытм з'яўляецца справядлівым намёкам имо, але ў гэтым выпадку алгарытм мае так шмат рашэнняў, яго трывіяльны знайсці, таму я проста дадаў яго. У рэшце рэшт, я з вамі згодны, таму я выдаліў адказ. Гэта проста раніцай тут, а часам я проста іду на аўтапілоце;) добрая сувязь, хоць, я буду выкарыстоўваць гэта ў будучыні, каб каментаваць пытанні, як гэты
дададзена аўтар greedybuddha, крыніца
Наколькі эфектыўна вы шукаеце? Вы можаце зрабіць гэта крыху хутчэй, з дадатковай радком коды, калі вы хочаце, каб я змясціў гэтую версію да замест гэтага
дададзена аўтар greedybuddha, крыніца
Гэта добры адказ, але я хацеў бы змяніць аб'яву на бацькоўскі клас Map карта = новы HashMap (); amazon.com/Effective-Java-2nd-Joshua-Bloch/ пп/0321356683
дададзена аўтар spuder, крыніца
але зрабіце .containsKey() ітэрацыю па ўсёй карце? і існуючая запіс будзе перапісаная кожны раз ..? здаецца неэфектыўным гэты шлях .. Не кажу, што гэта дрэнна .. Падыход
дададзена аўтар Jan S, крыніца
Добры пытанне: P .. кожны шукаў самы хуткі, ці не так? ;) Яго настолькі далёка .. Я думаю, што версія Workin майго падыходу будзе павальнейшай .. з усёй упарадкавана і л. Вялікі дзякуй :)
дададзена аўтар Jan S, крыніца

Вы можаце выкарыстоўваць Java HashMap:

Map occurrenceOfStrings = new HashMap();

for(String str: patternsTest)
{
    Integer currentValue = occurrenceOfStrings.get(str);
    if(currentValue == null)
        occurrenceOfStrings.put(str, 1);
    else
        occurrenceOfStrings.put(str, currentValue + 1);
}
4
дададзена

Guava Multiset solution (two lines of code):

Multiset multiset = HashMultiset.create();
multiset.addAll(Arrays.asList(patternsTest));

//Then you could do...
multiset.count("hello");//Return count the number of occurrences of "hello".

Мы маглі б выкарыстоўваць яго як спарадкаваныя і зніміце спарадкаваныя масівы. Прастата ў абслугоўванні кода.

0
дададзена

Guava Multiset solution (two lines of code):

Multiset multiset = HashMultiset.create();
multiset.addAll(Arrays.asList(patternsTest));

//Then you could do...
multiset.count("hello");//Return count the number of occurrences of "hello".

Мы маглі б выкарыстоўваць яго як спарадкаваныя і зніміце спарадкаваныя масівы. Прастата ў абслугоўванні кода.

0
дададзена

вы маглі б паспрабаваць карту і толькі адзін цыкл

Map occurences = new HashMap();
String currentString = patternsTest[0];
Integer count = 1;

for (int i = 1; i < patternsTest.length; i++) {
    if(currentString.equals(patternsTest[i]) {
        count++;
    } else {
        occurrences.put(currentString, count);
        currentString = patternsTest[i];
        count = 1;
    }
}
occurrences.put(currentString, count);
0
дададзена

вы маглі б паспрабаваць карту і толькі адзін цыкл

Map occurences = new HashMap();
String currentString = patternsTest[0];
Integer count = 1;

for (int i = 1; i < patternsTest.length; i++) {
    if(currentString.equals(patternsTest[i]) {
        count++;
    } else {
        occurrences.put(currentString, count);
        currentString = patternsTest[i];
        count = 1;
    }
}
occurrences.put(currentString, count);
0
дададзена

Маё рашэнне:

public int cantOccurences(String pattern, String[] values){
  int count = 0;

  for (String s : values) {
    count +=  (s.replaceAll("[^".concat(pattern).concat("]"), "").length());
  }
return count;
}
0
дададзена

Маё рашэнне:

public int cantOccurences(String pattern, String[] values){
  int count = 0;

  for (String s : values) {
    count +=  (s.replaceAll("[^".concat(pattern).concat("]"), "").length());
  }
return count;
}
0
дададзена

Гэта не мае індэкс па-за межамі:

String[] patternsTest = {"a", "b"};
for (int i = 0; i < patternsTest.length-1; i++) {
    int occ=1;
    String temp=patternsTest[i];
    while(temp.equals(patternsTest[i+1])){
        i++;
        occ++;
    }
}

Вы можаце выклікаць індэкс па-за межамі шляхам змены дадзеных у:

String[] patternsTest = {"a", "a"};
0
дададзена

Гэта не мае індэкс па-за межамі:

String[] patternsTest = {"a", "b"};
for (int i = 0; i < patternsTest.length-1; i++) {
    int occ=1;
    String temp=patternsTest[i];
    while(temp.equals(patternsTest[i+1])){
        i++;
        occ++;
    }
}

Вы можаце выклікаць індэкс па-за межамі шляхам змены дадзеных у:

String[] patternsTest = {"a", "a"};
0
дададзена