标签:class blog java ext com get
String[] str = {"12","121"}; String[] str1 = {"12","121"}; String[] str2 = {"12","121","122"}; String[] str3 = {"123","1234","125","126","111"}; String[] str4 = {"1234","126","125","1232","111"}; String[] str6 = {"12","121","222","1433","1234","126","125","1232"};
12,121,122 一块儿出现 2次
1234,125,126一块儿出现3次
1234,126,125,111 一块儿出现2次
package csdn; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * 自己定义一个数据类型,用来模拟二进制计算 * @author sztsiang * */ class Num{ private byte[] data; private int length; Num(int length){ data = new byte[length]; this.length = length; } public boolean increase(){ for(int i = length -1 ; i >= 0; i--){ if(i == 0 && data[0] == 1) return false; if(data[i] == 1) data[i] = 0; else{ data[i] = 1; break; } } return true; } public byte get(int index){ return data[index]; } public int getCount(){ int n = 0; for(int i = 0 ; i < length; i ++) if(data[i] == 1) n++; return n; } } /** * 对于每一组字符串,把每个字符串的组信息保存到set中, * 也就是一个字符串在哪几个set中出现就记录下来了,再把字符串和set用map保存起来。 * 对于一个字符串数组,遍历每一个字符串,并到map中拿所在的组号。 * 把这些组号最交集就是出现的次数 * 不知道这样想对不起以及效率高不高。 * @author sztsiang * */ public class EqualAndCount { private int count = 0; Map<String, Set<Integer>> map = new HashMap<String, Set<Integer>>(); private void add(String key){ Set<Integer> set = null; if(map.containsKey(key)){ set = map.get(key); set.add(count); map.put(key, set); }else{ set = new HashSet<Integer>(); set.add(count); map.put(key, set); } } /** * 添加 * @param strs */ public void add(String[] strs){ count++; for(String str : strs) add(str); } /** * 返回一个key值对应的set * @param key * @return Set<Integer> */ private Set<Integer> getSet(String key){ return map.get(key); } /** * 传入两个Set<Integer> * 返回一个Set同时拥有两者相同部分数据 * @param set1 * @param set2 * @return Set<Integer> */ public Set<Integer> combineSet(Set<Integer> set1, Set<Integer> set2){ Set<Integer> set = new HashSet<Integer>(); Iterator<Integer> ite = set2.iterator();//优化,哪个小遍历哪个? while(ite.hasNext()){ Integer t_value = ite.next(); if(set1.contains(t_value)){ //System.out.println("contains:"+ t_value); set.add(t_value); } } return set; } /** * 返回一个字符串数组对应的符合次数 * @param strs * @return count */ public int getEqualCount(String[] strs){ Set<Integer> set = null; for(String str : strs){ Set<Integer> t_set = getSet(str); set = (set == null ? t_set : combineSet(set, t_set)); } return set.size(); } /** * 把字符串数组变成一个字符串 * @param args * @return String */ private String ArraysToString(String args[]){ StringBuilder sb = new StringBuilder(); sb.append("["); int length = args.length; for(int i = 0 ; i < length -1; i++){ sb.append(args[i] +", "); } sb.append(args[length-1]); sb.append("]"); return sb.toString(); } /** * 打印 * @param str * @param count */ private void printResult(String str, int count){ if(count > 1)//当大于一次的时候输出,如果想都输出就不写if System.out.println(str + "==>" + count); } /** * 生成key的各种组合可能,并计算该组合出现的次数 */ public void Traversal(){ List<String> list = new ArrayList<String>(map.keySet()); int list_size = list.size(); Num n = new Num(list.size()); int index = 0; String str[]; while(n.increase()){ index = 0; int t = n.getCount(); str = new String[t]; for(int i = 0; i < list_size; i++){ if(n.get(i) == 1) str[index++] = list.get(i); } int equal_count = getEqualCount(str); printResult(ArraysToString(str), equal_count); } } /** * main * @param args */ public static void main(String args[]){ String[] str = {"12","121"}; String[] str1 = {"12","121"}; String[] str2 = {"12","121","122"}; String[] str3 = {"123","1234","125","126","111"}; String[] str4 = {"1234","126","125","1232","111"}; String[] str6 = {"12","121","222","1433","1234","126","125","1232"}; EqualAndCount eac = new EqualAndCount(); eac.add(str); eac.add(str1); eac.add(str2); eac.add(str3); eac.add(str4); eac.add(str6); eac.Traversal();//自己组合所有的可能,然后查看次数 System.out.println(eac.getEqualCount(str)); System.out.println( eac.getEqualCount(str2)); System.out.println(eac.getEqualCount(new String[]{"1234", "126", "125","111"})); System.out.println(eac.getEqualCount(new String[]{"1234", "126", "125"}) + "<<<"); System.out.println(eac.getEqualCount(new String[]{"111"})); System.out.println(eac.getEqualCount(new String[]{"1433","111"})); } }
自己想的办法实现的,正确性未验证,效率都没考虑……毕竟是自己想出来的,就在这里记一下……
多个字符串数组求相同数据及出现次数,布布扣,bubuko.com
标签:class blog java ext com get
原文地址:http://www.cnblogs.com/kischn/p/3800143.html