对相同字母组合的单词进行归类

要求:

Please use javascript (or your favorite programming language) to write a 
function that do the following.
Given an array of strings, return an array of arrays of strings that 
groups all anagrams.
An anagram is a word that has the same letters, but in different positions.

i.e. given ["cars", "thing", "scar", "dog", "god", "arcs", "the"]
return [["cars", "scar", "arcs"], ["thing"], ["dog", "god"], ["the"]]

大体意思就是:用你熟悉的语言,将上面给出的数据 分成 下面的样子。

给出的单词可以是其他的单词。

思路: 既然是相同单词的不同位置,那么里面所含有的字母应该是一样的。所以想到将已有单词进行先排序(可以是从A-Z),

然后单词相同的为同一组的元素。

废话不多说 看代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

/**
 *
 * @author guannan
 *
 */
public class TestPr {
    static HashMap<String, ArrayList<String>> strArr = new HashMap<String, ArrayList<String>>();

    public static void main(String[] args) {
        ArrayList<String> ar = new ArrayList<String>();
        // 添加要处理的数组
        ar.add("cars");
        ar.add("thing");
        ar.add("scar");
        ar.add("dog");
        ar.add("god");
        ar.add("arcs");
        ar.add("the");

        //排序活的要得到分组集合
        syoArr(ar);
        //打印集合元素
        showArr(strArr);
    }

    private static void showArr(HashMap<String, ArrayList<String>> strArr2) {
        //方法一:加强for
//        for (Map.Entry<String, ArrayList<String>> entry : strArr2.entrySet()) {
//            System.out.println("key :" + entry.getKey());
//            for (int i = 0; i < entry.getValue().size(); i++) {
//                System.out.println(entry.getValue().get(i));
//            }
//        }
        //方法二:普通遍历
        Iterator i = strArr2.entrySet().iterator();
        while(i.hasNext()){
            Entry  entry=(Entry)i.next();
            System.out.println("key :" + entry.getKey());
            ArrayList<String> value = (ArrayList<String>) entry.getValue();
            for (int k = 0; k <value.size(); k++) {
            System.out.println(value.get(k));
        }
        }
    }

    public static void syoArr(ArrayList<String> arr) {
        ArrayList<String> ar2 = new ArrayList<String>();
        HashMap<String, String> ha = new HashMap<String, String>();

        for (int i = 0; i < arr.size(); i++) {
            String stringByOrder = getStringByOrder(arr.get(i).toCharArray());
            if (ha.containsKey(stringByOrder)) {
                ArrayList<String> arrayList = strArr.get(stringByOrder);
                arrayList.add(arr.get(i));
                strArr.put(stringByOrder, arrayList);
            } else {
                ha.put(stringByOrder, arr.get(i));
                ArrayList<String> ar1 = new ArrayList<String>();
                ar1.add(arr.get(i));
                strArr.put(stringByOrder, ar1);
            }

        }
    }

    public static String getStringByOrder(char[] oldChar) {
        Arrays.sort(oldChar);
        return String.valueOf(oldChar);
    }
}

最后的输出结果:

key :eht
the
key :ghint
thing
key :dgo
dog
god
key :acrs
cars
scar
arcs

==========================================

一些小的技巧  献丑献丑

时间: 2024-10-14 08:26:31

对相同字母组合的单词进行归类的相关文章

揭秘资深米农“乡土老农”的域名投资之路

2014-11-17 微域名 [新朋友]点击标题下“微域名”关注. [老朋友]点击右上角分享给朋友. 在互联网世界,域名被称为“玉米”,相当于门牌号码:而国内从事域名注册与域名买卖的人,自然成了“米农”.近几年,动辄诱发江湖纷争.舆论围观的“米农”,自己却身形隐秘,极其低调.他们究竟如何呼风唤雨,操盘域名交易?这究竟是一门怎样的生意?一位资深“米农”对记者独家道出幕后的故事. 豪赌:“0531”两年涨6倍   “乡土老农”今年30多岁,供职于山东济南的一家媒体.“我大学专业跟IT有关,2002年

Linux命令行下的快捷键

1. 命令行下的快捷键 经常在命令行下工作的同志们,可能用的最多的就是两个上下键,主要用来调出历史命令:使用左右箭头使光标向后或向前移动以修改上次使用过的命令.其实这样做效率并不是很高,有了快捷键可以让我们的效率有所提高,而且看起来还更专业.更加Awesome.更加Geek.掌握了这些快捷键,我们可以做到手不离主键盘区域,完全可以忽略掉键盘上的四个可爱的箭头.当我们熟练之后,会越发喜欢这种方式. 1.1 常用快捷键介绍 下面介绍一些作者在命令行下经常使用的快捷键,这些快捷键在Emacs下面是有同

《BI那点儿事》数据流转换——模糊分组转换

在模糊查找中我们提到脏数据是怎样进入到表中的事情,主要还是由于一些“Lazy-add”造成的.这种情况我们的肉眼很容易被欺骗,看上去是同一个单词,其实就差那么一个字母,变成了两个不同的单词.一个简单的例子是X-Ray Tech和xRey,我们很有可能认为他们是同一个职务,CT操作员,但是如果让计算机来处理的话,它们是两种截然不同的东西.和模糊查找一样,模糊分组可以查找出多行中出现的类似的单词进行归类.我们可以使用这些归类得到的结果清洗数据源或者在不修改基础数据的情况下对原表进行修改.模糊分组也需

[每日app二]月入60万多嘛?单词锁屏的潜力!

抢了用户的时间,就是抢了用户的金钱! 单词锁屏,一个开发难度不太大,但仅仅360手机助手下载就是每周4万!拉风- 对于搞app的同学来说,搞个锁屏,还不是玩似的,但是要定位好,玩得好,那就有难度了.最重要的是这个满大街广告横飞的世界,人家做到无 广告,无支付,被用户好评9.1那也是正常能理解的事情了. 还有一件事情就是,千万要记住,现在不收费,不等于以后不收,或者说不等于以后没有盈利模式. 废话不想多说,直接安装“单词锁屏”! 看到没?人家在Splash界面写着“让没有意义的解锁变为有意义的事情

48个国际英语音标发音表与英语单词的偏旁部首

英语48个国际音标表 元音 20个 单元音 前元音 [i?](一拖长) [?](一) [e] [æ] 中元音 [??](厄拖长) [?]( 厄) [?](啊) 后元音 [u?](屋拖长) [?]( 屋) [??](凹拖长) [?](凹) [ɑ?](啊拖长) 双元音 开合双元音 [e?](A) [a?](爱) [??]( 凹一) [a?](阿-屋) [??]( 欧) 集中双元音 [??](一厄) [e?]( 哀-厄) [??]( 屋-厄) 辅音 28个 爆破音 清辅音 [p] [t] [k] 浊辅

英语词根学习笔记(二)——《英语词根与单词的说文解字》李平武

Part 1 英语词根的基本知识 四.从词根看词缀 传统上,词缀分为两类: 派生词缀,可加在单词上构成派生词,如un-,-er,-ly,ing等: 屈折词缀,可加在词尾上表示语法关系,如-ing(表进行时),-ed(表完成时),-s(表名词复数)等. 但这两种词缀都只能加在自由词根上,无法应对粘附词根带来的词缀问题. 如果检视含有粘附词根的单词,可以分析出许多与粘附词根相对的成分: 含有粘附词根的单词 与粘附词根相对的成分 visible -ible unite -ite union -ion

html常用单词

htmllss常用单词head头body身体title标题table表格list列表item条款row行column列form表单input输入text文本password密码submit提交reset重置button按钮image图像anchor锚audio音频的video视频ruler标尺division划分label标签style样式script脚本select选择option选项paragraph段落color颜色backgyound背景class类blink闪烁italic斜体soli

电影功夫熊猫使用的单词分析

你英语四级过了吗?功夫熊猫看了吗?功夫熊猫使用了995个英语单词,你会说很简单吧,别急,我给你分析一下,这些单词中有236个单词不在四级词汇范围内,花两分钟时间看看你是否认识这些单词,单词后面跟的数字表示该单词在电影中出现的次数. 你也可以获取本文的分析程序,这样你就可以分析其他电影了.看一部电影之前,先通过这种方式分析一下,然后学习自己不认识的单词,然后再去看电影,如此这样坚持下去,英语水平就会有很大的提升. words(995): 1. you 2492. the 1893. i 1844.

storm单词计数 本地执行

import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.io.FileUtils; import backtype.storm.Config; imp