在 Java 中,“组合结构”通常有两种常见理解,下面分别说明,并给出实现方式。
如果你说的“组合结构”是指树形结构 / 部分-整体结构(如文件夹-文件、菜单-子菜单),那就是组合模式。
// 抽象组件
abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
public abstract void operation();
}
// 叶子节点
class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public void operation() {
System.out.println("Leaf: " + name);
}
}
// 组合节点
import java.util.ArrayList;
import java.util.List;
class Composite extends Component {
private List<Component> children = new ArrayList<>();
public Composite(String name) {
super(name);
}
public void add(Component c) {
children.add(c);
}
public void remove(Component c) {
children.remove(c);
}
@Override
public void operation() {
System.out.println("Composite: " + name);
for (Component c : children) {
c.operation();
}
}
}
// 使用
public class Test {
public static void main(String[] args) {
Composite root = new Composite("Root");
root.add(new Leaf("File1"));
root.add(new Leaf("File2"));
Composite sub = new Composite("Folder");
sub.add(new Leaf("File3"));
root.add(sub);
root.operation();
}
}
如果你是指从 n 个元素中取 k 个的组合(C(n,k)),可以用递归或回溯实现。
import java.util.ArrayList;
import java.util.List;
public class Combination {
public static void combine(int[] nums, int k) {
backtrack(nums, k, 0, new ArrayList<>());
}
private static void backtrack(int[] nums, int k, int start, List<Integer> path) {
if (path.size() == k) {
System.out.println(path);
return;
}
for (int i = start; i < nums.length; i++) {
path.add(nums[i]);
backtrack(nums, k, i + 1, path);
path.remove(path.size() - 1);
}
}
public static void main(String[] args) {
combine(new int[]{1, 2, 3, 4}, 2);
}
}
如果你能具体说明是设计模式、数据结构,还是算法问题,我可以给你更针对性的实现。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。