java中的类内类

java中的类内类,java,arrays,class,traversal,Java,Arrays,Class,Traversal,编辑, 我不能分享这张照片,但让我们再试一次 我有一个数组,它有4个部分,第一部分只取以a开头的字符串,最后一部分取以d开头的字符串 输入字符串仅包含a、b、c、d,使其更简单 当输入为“bcda”时,它将进入数组。接下来它应该选择数组[2],因为第二个字符是c,然后是d数组[3],然后是字符a的数组[4] 然后我会插入这个字符串。所以下一次,如果我想看到给定的字符串,比如说相同的“bcda”是否存在,我将使用char序列遍历路径,而不是比较可用集合中的所有字符串,然后我将知道这个字符串名是否存

编辑, 我不能分享这张照片,但让我们再试一次

我有一个数组,它有4个部分,第一部分只取以a开头的字符串,最后一部分取以d开头的字符串

输入字符串仅包含a、b、c、d,使其更简单

当输入为“bcda”时,它将进入数组。接下来它应该选择数组[2],因为第二个字符是c,然后是d数组[3],然后是字符a的数组[4]

然后我会插入这个字符串。所以下一次,如果我想看到给定的字符串,比如说相同的“bcda”是否存在,我将使用char序列遍历路径,而不是比较可用集合中的所有字符串,然后我将知道这个字符串名是否存在

假设我输入了几个基于a,b,c,d的字符串

例如,“acdb”、“bcda”、“dbca”等

我想要的是,当我的程序收到字符串“acdb”时,它会这样保存

----------------
| a| b | c | d |
----------------
  |
  |
----------------
| a| b | c | d |
----------------
         |
         | 
----------------
| a| b | c | d |
----------------
             |
             | 
----------------
| a| b | c | d |
----------------
     |
     |
and here it can add string in list
很不幸,由于我的几点原因,我无法添加图像:(我希望我用自己创造的形象正确地解释

所以当我搜索这些限制范围内的任何字符串时,我可以很容易地找到这个字符串是否存在

我很困惑如何在类内创建类内类…:(

我可以创建一个简单的列表,并在数组中添加给定的字符串。这很简单,但无法前进

class MyList {

    TreeSet<String> list = new TreeSet<String>();

}

class Test
{
    MyList Array[] = new MyList [4];

    public Test(){
        for (int k = 0; k < 4; k++){

            Array[k] = new MyList ();
        }
    }
}
类MyList{
树集列表=新树集();
}
课堂测试
{
MyList数组[]=新的MyList[4];
公开考试(){
对于(int k=0;k<4;k++){
数组[k]=new MyList();
}
}
}

如果您想在一个类中创建一个类,下面是您将如何实现这一点的。当内部类与外部类密切相关,但实际上没有在其他任何地方使用时,您可以使用它。或者您可能只是出于任何原因想将它们组合在一起

class OuterClass {

    class InnerClass {

    }

}
如果您希望一个类包含它自己,下面是您将如何实现的方法。您可以这样做来创建一个对象列表。这看起来更像您正在尝试的操作

class MyClass {

    MyClass nextInTheList;

    public MyClass() {

    }

    public void setNext(MyClass next) {
        nextInTheList = next;
    }
}

内部类几乎与您的问题无关。以下是您真正想要做的:

public class CharNode extends AbstractCollection<CharSequence>{
    Map<Character, CharNode> children = new HashMap<>();
    int mark = 0;

    @Override
    public void add(CharSequence s){
        if(s.length()==0){mark++; return}
        if(!children.containsKey(s.charAt(0))
            children.put(s.charAt(0), new CharNode());

        children.get(s.charAt(0)).add(s.subSequence(1,s.length()));
    }

    @Override
    public void remove(CharSequence s){
        if(s.length()==0){mark--; return;}

        CharNode child = children.get(s.charAt(0));
        child.remove(s.subSequence(1,s.length()));

        if(child.isEmpty()) children.remove(s.charAt(0));
    }

    @Override
    public boolean contains(CharSequence s){
        if(s.length()==0) return mark;
        return children.containsKey(s.charAt(0)) &&
               children.get(s.charAt(0)).contains(s.subSequence(1,s.length()));
    }

    @Override
    public int size(){
        int result = mark;
        for(CharNode child: children.values()) result+= child.size();
        return result;
    }

    @Override
    public Iterator<CharSequence> iterator(){
        return new Iterator<CharSequence>(){
            @Override public boolean hasNext(){  /* you do this part */  }
            @Override public CharSequence next(){ /* you do this part */ }
            @Override public boolean remove(){ /* you do this part */ }
        }
    }


}
public类CharNode扩展了AbstractCollection{
Map children=newhashmap();
整数分=0;
@凌驾
公共无效添加(字符序列){
如果(s.length()==0){mark++;return}
如果(!children.containsKey(s.charAt(0))
put(s.charAt(0),new CharNode());
get(s.charAt(0)).add(s.subSequence(1,s.length());
}
@凌驾
公共无效删除(字符序列){
如果(s.length()==0){mark--;return;}
CharNode child=children.get(s.charAt(0));
移除(s.子序列(1,s.长度());
if(child.isEmpty())children.remove(s.charAt(0));
}
@凌驾
公共布尔包含(字符序列){
如果(s.length()==0)返回标记;
返回子项。containsKey(s.charAt(0))&&
get(s.charAt(0)).contains(s.subSequence(1,s.length());
}
@凌驾
公共整数大小(){
int结果=分数;
for(CharNode-child:children.values())结果+=child.size();
返回结果;
}
@凌驾
公共迭代器迭代器(){
返回新的迭代器(){
@重写公共布尔hasNext(){/*您执行此部分*/}
@重写public CharSequence next(){/*执行此部分操作*/}
@重写公共布尔删除(){/*您执行此部分*/}
}
}
}

最后一种方法,
iterator
,涉及到使用匿名内部类,这是唯一一种真正重要的内部类,也是我推荐给不熟悉内部类工作方式的人使用的唯一类型。

您想格式化输出吗?为什么不使用TreeSet?如何使用
Collections.sort(str.tocharray())
您不想使用内部类。使用内部类有很多很多“gotcha”。如果可能的话,我会尽量避免使用它们。您在问什么?如果一个字符串包含的字母与添加的另一个字符串的字母完全相同?