我有一个String
,其中包含逗号分隔形式的数字。我想从String中提取出现最多的数字。
例如,我有一个像..的字符串
String str="1,2,3,4,5,6,7,19,18,4";
从上面的str我需要4因为4是两次str。
与
相同String str2="1,2,3,4,6,4,3,9";
从上面的str2我需要3,4
如果所有数字都是唯一的,那么我首先需要一个。
建议我采取更好的方法。
答案 0 :(得分:2)
我会有一个整数映射数组来计算每个数字,而变量来存储数字最多的数字。
将字符串拆分为数字列表,然后遍历列表。
每次查看新数字时,在地图中递增其计数器,如果该计数大于当前最高计数,则将当前最高值更改为当前值。在字符串的末尾,返回当前最高值。
请注意,如果您还存储了第二大数量的数字,则可以通过提前退出循环来稍微优化,此时没有足够的数字允许第二个最高数量超过最高数量。
答案 1 :(得分:2)
您可以使用java.util.StringTokenizer
使用,
作为分隔符来标记字符串,然后使用String.trim()
从每个标记中删除前导和尾随空格,然后将它们存储到{ {1}}使用int
函数。然后你可以很容易地计算它们。
计算:
如果您的数字范围很小,那么您只需创建一个计数器数组并使用每个数字作为该数组的索引。如果没有,那么您可以使用Integer.parseInt()
或类似的东西。
答案 2 :(得分:2)
假设这是一个家庭作业,我会建议一个没有代码的总体思路:
','
个字符Integer
到Integer
的初始空地图
int
值1
。1
,则返回第一个标记1
,请再次浏览地图,并收集值等于最大值的所有键这种方法允许您使用非常大的数字,并且它不区分带有和不带前导零的数字。换句话说,它会将3
序列中的1,2,03,3,3,2
标识为唯一的赢家,而不是与2
的关系。
答案 3 :(得分:1)
将您的String转换为数字列表。
记住列表的第一个数字。
对数字列表进行排序。
迭代列表并保持
在每次迭代时,如果当前数字等于当前最大值,则将当前数字添加到结果中。如果它大于当前最大值,则清除结果集并将当前数字添加到结果中。
在循环结束时,如果结果集的大小等于不同数字的数量,则在排序列表之前返回您记住的第一个数字。
答案 4 :(得分:0)
尝试以下代码
public class StringCheck {
public static void main(String args[]) {
String input = "1,2,3,4,5,6,2,3,4,1,4,33,33,33";
String result = "";
String[] arr1 = input.split(",");
System.out.println("Input is : " + input);
for (int i = 0; i < arr1.length; i++) {
int k = 0;
for (int j = 0; j < arr1.length; j++) {
if (arr1[i].equals(arr1[j])) {
k++;
if (k == 2) {
if (result.contains(arr1[i])) {
break;
}
result = result + arr1[i] + ",";
break;
}
}
}
}
System.out.println("Result is " + result);
}
}
下面将输出
Input is : 1,2,3,4,5,6,2,3,4,1,4,33,33,33
Result is 1,2,3,4,33,
如果有任何疑问,请告诉我......
干杯!!!
答案 5 :(得分:0)
以下是使用java.util和Guava collect的解决方案。
概要
Word -> Count
Count -> Words
代码:
public class HighestCountFinder {
public static ImmutableSet<String> findWordsWithGreatestCount(String wordsString) {
List<String> words = split(wordsString, ",");
Map<String, Integer> wordsToCounts = toMapWithCounts(words);
Multimap<Integer, String> countsToWords = toInverseMultimap(wordsToCounts);
NavigableMap<Integer, Collection<String>> countsToWordsSorted = toNavigableMap(countsToWords);
Collection<String> wordsWithHighestCount = lastValue(countsToWordsSorted);
return ImmutableSet.copyOf(wordsWithHighestCount);
}
public static ImmutableList<String> split(String wordsString, String separator) {
Iterable<String> parts = Splitter.on(separator).split(wordsString);
return ImmutableList.copyOf(parts);
}
public static ImmutableMap<String, Integer> toMapWithCounts(Iterable<String> entries) {
Multiset<String> entriesWithCounts = HashMultiset.create(entries);
return toMap(entriesWithCounts);
}
public static <E> ImmutableMap<E, Integer> toMap(Multiset<E> multiset) {
ImmutableMap.Builder<E, Integer> immutableMapBuilder = ImmutableMap.builder();
for (Multiset.Entry<E> entry : multiset.entrySet()) {
immutableMapBuilder.put(entry.getElement(), entry.getCount());
}
return immutableMapBuilder.build();
}
public static <K, V> ImmutableMultimap<V, K> toInverseMultimap(Map<K, V> map) {
Multimap<K, V> multimap = Multimaps.forMap(map);
return ImmutableMultimap.copyOf(multimap).inverse();
}
public static <K, V> NavigableMap<K, Collection<V>> toNavigableMap(Multimap<K, V> multimap) {
return new TreeMap<>(multimap.asMap());
}
public static <V> V lastValue(NavigableMap<?, V> navigableMap) {
return navigableMap.lastEntry().getValue();
}
}